wok rev 23984

linld: fix bootiso/strhead
author Pascal Bellard <pascal.bellard@slitaz.org>
date Wed Nov 25 20:41:41 2020 +0000 (2020-11-25)
parents fc88d0826de4
children 555bcdab610b
files linld/stuff/src/CRTL.ASM linld/stuff/src/ISO9660.CPP linld/stuff/src/ISOCRTL.ASM linld/stuff/src/JUMP.ASM linld/stuff/src/pipehole.awk
line diff
     1.1 --- a/linld/stuff/src/CRTL.ASM	Tue Nov 24 08:47:45 2020 +0000
     1.2 +++ b/linld/stuff/src/CRTL.ASM	Wed Nov 25 20:41:41 2020 +0000
     1.3 @@ -135,20 +135,17 @@
     1.4          global  @strcmp$qpxzct1:near
     1.5          proc    @strcmp$qpxzct1 near
     1.6  
     1.7 -                push	si
     1.8 -		xchg	ax,si
     1.9 -		dec	bx
    1.10 -@@lp:
    1.11 -		inc	bx
    1.12 -		lodsb
    1.13 -		sub	al,[bx]
    1.14 -		jnz	@@out
    1.15 -		or	al,[bx]
    1.16 -		jnz	@@lp
    1.17 -@@out:
    1.18 -		cbw
    1.19 -                pop	si
    1.20 -                ret
    1.21 +@@loop:
    1.22 +		xchg	ax,bx
    1.23 +                mov	cl,[bx]			; cl = *b++
    1.24 +                inc	bx
    1.25 +		xchg	ax,bx
    1.26 +                cmp	cl,[bx]			; cl ?= *a++
    1.27 +		jnz	fail			; return -1
    1.28 +                inc	bx
    1.29 +		or	cl,cl			; clear C
    1.30 +		jz	failifc			; return 0
    1.31 +                jmp	@@loop
    1.32  
    1.33          endp    @strcmp$qpxzct1
    1.34  	endif
    1.35 @@ -169,6 +166,7 @@
    1.36  
    1.37  open:						; open(bx)
    1.38  	ifdef	ISOHOOK
    1.39 +;_fastcall int open(bx:const char* name);
    1.40  		extrn	iso_open_hack:word
    1.41  		call	[iso_open_hack]		; or ret
    1.42  	endif
    1.43 @@ -255,6 +253,7 @@
    1.44                  mov	ah,3Fh
    1.45  		endif
    1.46  	ifdef	ISOHOOK
    1.47 +;_fastcall int read(bx:int fd, dx:void* data, cx:int sz);
    1.48  		extrn	iso_read_hack:word
    1.49  		call	[iso_read_hack]		; or ret
    1.50  	endif
    1.51 @@ -298,6 +297,7 @@
    1.52  		sbb	cx,cx
    1.53  lseekset:
    1.54  	ifdef	ISOHOOK
    1.55 +;_fastcall long lseek(ax:int fd, cxdx:unsigned long offset, bl:whence);
    1.56  		extrn	iso_lseek_hack:word
    1.57  		call	[iso_lseek_hack]	; or ret
    1.58  	endif
    1.59 @@ -417,7 +417,7 @@
    1.60  		endif
    1.61  		cmp	[byte bx],'|'
    1.62  		je	@@test
    1.63 -		cmp	[byte bx],0
    1.64 +		cmp	[byte bx],dh
    1.65  		je	@@test
    1.66  		mov	al,-1
    1.67  		inc	bx
    1.68 @@ -425,7 +425,7 @@
    1.69  @@test:
    1.70  		or	al,al			; 1st loop ?
    1.71  		jns	@@testal
    1.72 -		cmp	[byte bx],0
    1.73 +		cmp	[byte bx],dh
    1.74  		jne	@@loop
    1.75  @@testal:
    1.76  		cmp	al,'='
     2.1 --- a/linld/stuff/src/ISO9660.CPP	Tue Nov 24 08:47:45 2020 +0000
     2.2 +++ b/linld/stuff/src/ISO9660.CPP	Wed Nov 25 20:41:41 2020 +0000
     2.3 @@ -12,17 +12,17 @@
     2.4  #endif
     2.5  
     2.6  #ifdef ISOHOOK
     2.7 -void isoroot(void)
     2.8 +#define isoroot() \
     2.9 +{ \
    2.10 +	static const unsigned long root = 16UL * 2048; \
    2.11 +	isoreadsector(&root); \
    2.12 +	setdirofs(isostate.dirofs, (* (unsigned long *) (isostate.buffer + 0x9E))); \
    2.13 +	isostate.dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6)); \
    2.14 +}
    2.15  #else
    2.16  int isoroot(void)
    2.17 -#endif
    2.18  {
    2.19  	static const unsigned long root = 16UL * 2048;
    2.20 -#ifdef ISOHOOK
    2.21 -	isoreadsector(&root);
    2.22 -	setdirofs(isostate.dirofs, (* (unsigned long *) (isostate.buffer + 0x9E)));
    2.23 -	isostate.dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6));
    2.24 -#else
    2.25  	if (isoreadsector(&root) == -1 || strhead(isostate.buffer+1,"CD001") == -1) {
    2.26  		//close(isostate.fd);
    2.27  		return -1;
    2.28 @@ -30,8 +30,8 @@
    2.29  	setdirofs(isostate.dirofs, (* (unsigned long *) (isostate.buffer + 0x9E)));
    2.30  	isostate.dirsize = filesize2dirsize(* (unsigned long *) (isostate.buffer + 0xA6));
    2.31  	return 0;
    2.32 +}
    2.33  #endif
    2.34 -}
    2.35  
    2.36  int isoreaddir(void)
    2.37  {
    2.38 @@ -122,12 +122,7 @@
    2.39  #define _64bits (x->_64bits)
    2.40  	char *s;
    2.41  
    2.42 -#ifdef ISOHOOK
    2.43 -	extern int _cpuhaslm();
    2.44 -	_64bits = _cpuhaslm();
    2.45 -#else
    2.46  	_64bits = cpuhaslm();
    2.47 -#endif
    2.48      do {
    2.49  #ifdef ISOHOOK
    2.50  	s = (char *) x->filename2open;
    2.51 @@ -155,7 +150,7 @@
    2.52  			n = "64";
    2.53  			i += s - name; // strlen(name);
    2.54  		}
    2.55 -		if (strcmp(i, n)) continue;
    2.56 +		if (strcmp(i, n) == -1) continue;
    2.57  #ifndef ISOHOOK
    2.58  		*s++ = c;
    2.59  #endif
     3.1 --- a/linld/stuff/src/ISOCRTL.ASM	Tue Nov 24 08:47:45 2020 +0000
     3.2 +++ b/linld/stuff/src/ISOCRTL.ASM	Wed Nov 25 20:41:41 2020 +0000
     3.3 @@ -6,7 +6,11 @@
     3.4                  %crefref
     3.5                  %noincl
     3.6                  %nomacs
     3.7 +	ifdef	NO386
     3.8                  p8086
     3.9 +	else
    3.10 +                p386
    3.11 +	endif
    3.12  
    3.13          group   DGROUP  _TEXT,_DATA,_BSS
    3.14          assume  cs:DGROUP,ds:DGROUP
    3.15 @@ -31,7 +35,10 @@
    3.16  
    3.17  		global	fold:near
    3.18  fold:
    3.19 -		org	0EF00h
    3.20 +		org	130h-100h
    3.21 +	        global  _cpu_features:dword
    3.22 +_cpu_features	dd	?
    3.23 +		org	0F000h-100h
    3.24  		global	unfold:near
    3.25  unfold:
    3.26  		jmp	iso_open
    3.27 @@ -52,14 +59,24 @@
    3.28  		stosw
    3.29  		mov	al,offset iso_close_hack-0F000h
    3.30  		stosw
    3.31 -		global	@_cpuhaslm$qv:near
    3.32 -@_cpuhaslm$qv:
    3.33 -		mov	ax,[130h+3]
    3.34 -		and	al,20h
    3.35 +	ifdef	NO386
    3.36 +        global  N_LXLSH@ES:near
    3.37 +N_LXLSH@ES:
    3.38 +		mov	dx,es
    3.39 +        global  N_LXLSH@:near
    3.40 +N_LXLSH@:
    3.41 +		mov	ch,0
    3.42 +@@lp:
    3.43 +		shl	ax,1
    3.44 +		rcl	dx,1
    3.45 +		loop	@@lp
    3.46 +	endif
    3.47  		ret
    3.48  
    3.49 +;***************************************************************
    3.50 +;_fastcall int open(bx:const char* name);
    3.51 +;***************************************************************
    3.52  iso_open_hack:
    3.53 -		pop	ax
    3.54  		extrn	@_isoopen$qv:near
    3.55  		cmp	[byte bx],'!'
    3.56  		je	@readmenu$qv
    3.57 @@ -70,33 +87,18 @@
    3.58  		call	@_isoopen$qv
    3.59  		cmp	al,1
    3.60  		cmc
    3.61 -		push	bx
    3.62  iso_close_hack:
    3.63  		pop	bx
    3.64  		ret
    3.65  
    3.66  
    3.67 -	macro   curseek
    3.68 -		push	cx
    3.69 -		xor	cx,cx
    3.70 -		mov	ax,4201h
    3.71 -		cwd
    3.72 -		call	dosfd		; lseek(,0L,SEEK_CUR)
    3.73 -		call	@doseek2
    3.74 -	ifndef	NO386
    3.75 -		push	dx
    3.76 -		push	ax
    3.77 -		pop	eax
    3.78 -	endif
    3.79 -		pop	cx
    3.80 -	endm
    3.81 -
    3.82  ;***************************************************************
    3.83  ;_fastcall void readmenu(void);
    3.84  ;***************************************************************
    3.85  	global	@readmenu$qv:near
    3.86  	proc	@readmenu$qv near
    3.87  
    3.88 +		pop	ax
    3.89  		mov	dx,18
    3.90  		xor	cx,cx
    3.91  		call	lseekset
    3.92 @@ -131,11 +133,11 @@
    3.93  dos:
    3.94  		int	21h
    3.95  failifc:
    3.96 -		jnc	@@dosok
    3.97 +		jnc	dosok
    3.98  fail:
    3.99  		sbb	ax,ax
   3.100  		cwd
   3.101 -@@dosok:
   3.102 +dosok:
   3.103  		ret
   3.104  
   3.105  	endp	@isolseek$qpxul
   3.106 @@ -168,11 +170,12 @@
   3.107                  mov	cl,[bx]			; cl = *b++
   3.108                  inc	bx
   3.109  		or	cl,cl			; clear C
   3.110 -		jz	failifc			; return 0
   3.111 +		jz	fail			; return 0
   3.112  		xchg	ax,bx
   3.113                  xor	cl,[bx]			; cl -= *a++
   3.114                  inc	bx
   3.115 -		and	cl,0dfh			; case insensitive
   3.116 +		or	cl,cl
   3.117 +		stc
   3.118  		jne	fail			; return -1
   3.119                  jmp	@@loop
   3.120  
   3.121 @@ -184,97 +187,91 @@
   3.122          global  @strcmp$qpxzct1:near
   3.123          proc    @strcmp$qpxzct1 near
   3.124  
   3.125 -                push	si
   3.126 -		xchg	ax,si
   3.127 -		dec	bx
   3.128 -@@lp:
   3.129 -		inc	bx
   3.130 -		lodsb
   3.131 -		sub	al,[bx]
   3.132 -		jnz	@@out
   3.133 -		or	al,[bx]
   3.134 -		jnz	@@lp
   3.135 -@@out:
   3.136 -		cbw
   3.137 -                pop	si
   3.138 -                ret
   3.139 +		call	@strhead$qpxzct1
   3.140 +		jne	dosok			; return -1
   3.141 +		xchg	ax,bx
   3.142 +		cmp	cl,[bx]
   3.143 +		jmp	fail			; return 0 or -1
   3.144  
   3.145          endp    @strcmp$qpxzct1
   3.146  
   3.147 +;***************************************************************
   3.148 +;_fastcall int read(bx:int fd=isostate.fd, dx:void* data, cx:int sz);
   3.149 +;***************************************************************
   3.150  iso_read_hack:
   3.151 +		push	dx
   3.152 +		push	cx
   3.153 +		xor	cx,cx
   3.154 +		mov	ax,4201h
   3.155 +		cwd
   3.156 +	ifdef	SEEK_CUR
   3.157 +		call	curpos		; bx = _isostate.fileofs
   3.158 +	else
   3.159 +		call	dosfd		; lseek(,0L,SEEK_CUR)
   3.160 +		call	sub_fileofs	; bx = _isostate.fileofs
   3.161 +	endif
   3.162  	ifdef	NO386
   3.163 +		mov	cx,[bx+4]	; _isostate.filesize
   3.164 +		sub	cx,ax
   3.165 +		mov	ax,[bx+6]
   3.166 +		sbb	ax,dx
   3.167 +		pop	ax
   3.168 +		ja	@@axok
   3.169 +		je	@@rem
   3.170 +		xor	ax,ax
   3.171 +@@rem:
   3.172 +		cmp	cx,ax
   3.173 +		jb	@@cxok
   3.174 +@@axok:
   3.175 +	else
   3.176  		push	dx
   3.177 -		curseek
   3.178 -		mov	bx,[word _isostate.filesize]
   3.179 -		sub	bx,ax
   3.180 -		mov	ax,[(word _isostate.filesize)+2]
   3.181 -		sbb	ax,dx
   3.182 -		ja	@@cxok
   3.183 -		je	@@rem
   3.184 +		push	ax
   3.185 +		pop	edx
   3.186 +		mov	eax,[bx+4]	; _isostate.filesize
   3.187 +		sub	eax,edx
   3.188 +		pop	cx
   3.189 +		ja	@@rem
   3.190  		xor	cx,cx
   3.191  @@rem:
   3.192 -		cmp	bx,cx
   3.193 +		movzx	ecx,cx
   3.194 +		cmp	eax,ecx
   3.195  		ja	@@cxok
   3.196 -		mov	cx,bx
   3.197 +	endif
   3.198 +		xchg	ax,cx
   3.199  @@cxok:
   3.200 -		pop	dx
   3.201 -	else
   3.202 -                p386
   3.203 -		push	edx
   3.204 -		curseek
   3.205 -		mov	edx,[_isostate.filesize]
   3.206 -		sub	edx,eax
   3.207 -		jnb	@@rem
   3.208 -		xor	cx,cx
   3.209 -@@rem:
   3.210 -		movzx	eax,cx
   3.211 -		cmp	edx,eax
   3.212 -		ja	@@cxok
   3.213 -		mov	cx,dx
   3.214 -@@cxok:
   3.215 -		pop	edx
   3.216 -	endif
   3.217 -		or	cx,cx
   3.218 -		pop	bx
   3.219 +		pop	dx		; buffer
   3.220 +		pop	bx		; skip last caller
   3.221  		jmp	readfd
   3.222  
   3.223 +;***************************************************************
   3.224 +;_fastcall long lseek(ax:int fd=isostate.fd, cxdx:unsigned long offset, bl:whence);
   3.225 +;***************************************************************
   3.226  iso_lseek_hack:
   3.227  		xchg	ax,bx
   3.228 -		pop	bx
   3.229 +		pop	bx		; skip last caller
   3.230  	ifdef	SEEK_CUR
   3.231  		cmp	al,1	; current
   3.232  		jne	@@nocurrent
   3.233 +curpos:
   3.234  		call	dosfd		; lseek(,0L,SEEK_CUR)
   3.235 -		jmp	@doseek2
   3.236 -@nocurrent:
   3.237 +		jmp	sub_fileofs
   3.238 +@@nocurrent:
   3.239  	endif
   3.240 -		add	dx,[word _isostate.fileofs]
   3.241 -		adc	cx,[(word _isostate.fileofs)+2]
   3.242 +		mov	bx,offset _isostate.fileofs
   3.243 +		add	dx,[bx]
   3.244 +		adc	cx,[bx+2]
   3.245  		cmp	al,0	; start
   3.246  		je	@@doseek
   3.247 -		add	dx,[word _isostate.filesize]
   3.248 -		adc	cx,[(word _isostate.filesize)+2]
   3.249 +		add	dx,[bx+4]	; _isostate.filesize
   3.250 +		adc	cx,[bx+6]
   3.251  @@doseek:
   3.252  		call	lseekset	; lseek(,0L,SEEK_SET)
   3.253 -@doseek2:
   3.254 -		sub	ax,[word _isostate.fileofs]
   3.255 -		sbb	dx,[(word _isostate.fileofs)+2]
   3.256 +sub_fileofs:
   3.257 +		mov	bx,offset _isostate.fileofs
   3.258 +		sub	ax,[bx]
   3.259 +		sbb	dx,[bx+2]
   3.260  		ret
   3.261  
   3.262 -	ifdef	NO386
   3.263 -        global  N_LXLSH@ES:near
   3.264 -N_LXLSH@ES:
   3.265 -		mov	dx,es
   3.266 -        global  N_LXLSH@:near
   3.267 -N_LXLSH@:
   3.268 -		mov	ch,0
   3.269 -@@lp:
   3.270 -		shl	ax,1
   3.271 -		rcl	dx,1
   3.272 -		loop	@@lp
   3.273 -		ret
   3.274 -	endif
   3.275 -
   3.276          ends    _TEXT
   3.277  
   3.278  	end
     4.1 --- a/linld/stuff/src/JUMP.ASM	Tue Nov 24 08:47:45 2020 +0000
     4.2 +++ b/linld/stuff/src/JUMP.ASM	Wed Nov 25 20:41:41 2020 +0000
     4.3 @@ -134,8 +134,11 @@
     4.4  		push	dx			; size hi
     4.5  		endif
     4.6  		push	si			; size lo=up to 512k
     4.7 -	        extrn   _imgs:dword
     4.8 -		push	[dword _imgs+2]		; src ofs = pm.fallback
     4.9 +
    4.10 +		include	"himem.inc"
    4.11 +
    4.12 +		extrn	_imgs:image_himem
    4.13 +		push	[_imgs.fallback]	; src ofs = pm.fallback
    4.14  
    4.15  		;in	al,70h
    4.16  		;or	al,80h			; disable NMI
     5.1 --- a/linld/stuff/src/pipehole.awk	Tue Nov 24 08:47:45 2020 +0000
     5.2 +++ b/linld/stuff/src/pipehole.awk	Wed Nov 25 20:41:41 2020 +0000
     5.3 @@ -315,7 +315,7 @@
     5.4  		if (/al,/ || /,al/) sub(/al/,"cl")
     5.5  		if (/cmp	byte ptr \[si\+34\],0/) $0="	or	cl,cl"
     5.6  		if (/jne	@@0$/) next
     5.7 -		if (/jmp	@3@58$/) $0="	je	@3@58"
     5.8 +		if (/jmp	@.@58$/) sub(/jmp/,"je")
     5.9  		sub(/mov	ax,-1/,"dec	ax")
    5.10  	}
    5.11  	 } # file == "iso9660.cpp"
    5.12 @@ -750,6 +750,7 @@
    5.13  	    /^	call	near ptr @isoopen\$/ ||
    5.14  	    /^	call	near ptr @isoreadsector\$/ ||
    5.15  	    /^	call	near ptr @strhead\$/ ||
    5.16 +	    /^	call	near ptr @strcmp\$/ ||
    5.17  	    /^	call	near ptr @argstr\$/ ||
    5.18  	    /^	call	near ptr @argnum\$/) { print; hold=17; next; }
    5.19  	s=$0