wok rev 13287

memtest: lzma compression
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Aug 26 00:21:22 2012 +0200 (2012-08-26)
parents b7e579c4b595
children 1d5a6d3ed1f5
files memtest/receipt memtest/stuff/pack memtest/stuff/unlzma.S syslinux/receipt
line diff
     1.1 --- a/memtest/receipt	Sat Aug 25 11:17:45 2012 +0200
     1.2 +++ b/memtest/receipt	Sun Aug 26 00:21:22 2012 +0200
     1.3 @@ -10,7 +10,7 @@
     1.4  WEB_SITE="http://www.memtest.org/"
     1.5  WGET_URL="${WEB_SITE}download/$VERSION/$TARBALL"
     1.6  
     1.7 -BUILD_DEPENDS="lz4"
     1.8 +BUILD_DEPENDS="lzma"
     1.9  
    1.10  # Rules to configure and make the package.
    1.11  compile_rules()
     2.1 --- a/memtest/stuff/pack	Sat Aug 25 11:17:45 2012 +0200
     2.2 +++ b/memtest/stuff/pack	Sun Aug 26 00:21:22 2012 +0200
     2.3 @@ -17,19 +17,17 @@
     2.4  	done | xargs echo -en | dd conv=notrunc bs=1 of=$2 seek=$3
     2.5  }
     2.6  
     2.7 -setup="$(dd bs=1 count=1 if=$1 skip=497 | hexdump -e '"" 1/1 "%d" "\n"')"
     2.8 -syssize="$(dd bs=1 count=2 if=$1 skip=500 | hexdump -e '"" 1/2 "%d" "\n"')"
     2.9 -
    2.10  compress()
    2.11  {
    2.12 -	lz4demo -c1 stdin stdout
    2.13 -	echo -en "\x00\x00\x00\x00"
    2.14 +	lzma e -si -so
    2.15  }
    2.16  
    2.17  main()
    2.18  {
    2.19  	dd if=$1 bs=512 count=1 >$2
    2.20  	uudecode | gunzip >>$2
    2.21 +	setup="$( echo $(od -j 497 -N 1 -dAn $1))"
    2.22 +	syssize="$(echo $(od -j 500 -N 2 -dAn $1))"
    2.23  	dd if=$1 bs=512 count=$setup skip=1 | compress >>$2
    2.24  	dd if=$1 bs=16 count=$syssize skip=$((32*(1+$setup))) | compress >>$2
    2.25  	size=$(stat -c %s $2)
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/memtest/stuff/unlzma.S	Sun Aug 26 00:21:22 2012 +0200
     3.3 @@ -0,0 +1,822 @@
     3.4 +// #define RC_NORMALIZE if (Range < kTopValue) { Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
     3.5 +//
     3.6 +// #define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
     3.7 +// #define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
     3.8 +// #define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
     3.9 +//
    3.10 +//#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \
    3.11 +//  { UpdateBit0(p); mi <<= 1; A0; } else \
    3.12 +//  { UpdateBit1(p); mi = (mi + mi) + 1; A1; }
    3.13 +//
    3.14 +// #define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;)
    3.15 +//
    3.16 +// #define RangeDecoderBitTreeDecode(probs, numLevels, res) \
    3.17 +//  { int i = numLevels; res = 1; \
    3.18 +//  do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \
    3.19 +//  res -= (1 << numLevels); }
    3.20 +/*
    3.21 + * Compression with : lzma e src dst -eos -pb2 -lp0 -lc3
    3.22 + */
    3.23 +
    3.24 +#define PROP_PB 2
    3.25 +#define PROP_LP 0
    3.26 +#define PROP_LC 3
    3.27 +#define PROPS (PROP_LC+(PROP_LP*9)+(PROP_PB*45))
    3.28 +
    3.29 +// static const Byte *Buffer;
    3.30 +// static UInt32 bound, Code, Range;
    3.31 +
    3.32 +/*
    3.33 + * Buffer register DS:SI
    3.34 + * all var based ws=ss:bp
    3.35 + */
    3.36 +
    3.37 +rep0		=	-4		// long
    3.38 +rep1		=	rep0-4		// long
    3.39 +rep2		=	rep0-8		// long
    3.40 +rep3		=	rep0-12		// long
    3.41 +state		=	-17		// byte, 0..11
    3.42 +posState 	=	state-1		// byte, 0..15
    3.43 +posState2 	=	posState-1	// byte, 0..15
    3.44 +scratched	=	rep0-16		// byte = 1
    3.45 +Code		=	-24		// long
    3.46 +outStream	=	-28		// long
    3.47 +nowPos		=	outStream	// long
    3.48 +Range		=	Code-8		// long
    3.49 +#define LOCALS		32
    3.50 +
    3.51 +// int LzmaDecode(CLzmaDecoderState *vs,
    3.52 +//     const unsigned char *inStream, 
    3.53 +//     unsigned char *outStream)
    3.54 +// {
    3.55 +//   CProb *p = vs->Probs;
    3.56 +//   SizeT nowPos = 0;
    3.57 +//   #define posStateMask = (1 << (vs->Properties.pb)) - 1;
    3.58 +//   #define literalPosMask = (1 << (vs->Properties.lp)) - 1;
    3.59 +//   int lc = vs->Properties.lc, state = 0, len = 0;
    3.60 +//   UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
    3.61 +// 
    3.62 +//   {
    3.63 +//     UInt32 i, numProbs = Literal /*1846*/
    3.64 +// 	    + ((UInt32)LZMA_LIT_SIZE /*768*/ << (lc + vs->Properties.lp));
    3.65 +//     for (i = 0; i < numProbs; i++) p[i] = kBitModelTotal /*2048*/ >> 1;
    3.66 +
    3.67 +#define WS (1846+(768<<(PROP_LC+PROP_LP)))
    3.68 +#if (WS+WS+LOCALS) >= 65000
    3.69 +/* MAX WS = (1846+(768<<(8+4))) > 3MB! */
    3.70 +#error invalid (lc,lp,pb) : out of memory
    3.71 +#endif
    3.72 +
    3.73 +ws1	=	WS
    3.74 +ws2	=	ws1*2
    3.75 +ws	=	ws2+LOCALS+15
    3.76 +
    3.77 +#ifndef FLAT32
    3.78 +#define	AX	%ax
    3.79 +#define	BX	%bx
    3.80 +#define	CX	%cx
    3.81 +#define	DX	%dx
    3.82 +#define	SI	%si
    3.83 +#define	DI	%di
    3.84 +#define	BP	%bp
    3.85 +#define	SP	%sp
    3.86 +#define CWD	cwd
    3.87 +#else
    3.88 +#define	AX	%eax
    3.89 +#define	BX	%ebx
    3.90 +#define	CX	%ecx
    3.91 +#define	DX	%edx
    3.92 +#define	SI	%esi
    3.93 +#define	DI	%edi
    3.94 +#define	BP	%ebp
    3.95 +#define	SP	%esp
    3.96 +#define CWD	cdq
    3.97 +#endif
    3.98 +/*
    3.99 + * LzmaDecode:
   3.100 +#ifndef FLAT32
   3.101 + *   input   ds:si=inStream, es:di=outStream
   3.102 + *   output  outStream[], ds:si, es:di
   3.103 + 	.code 16
   3.104 +#else
   3.105 + *   input   esi=inStream, edi=outStream
   3.106 + *   output  outStream[], esi, edi
   3.107 + 	.code 32
   3.108 +#endif
   3.109 + */
   3.110 + 
   3.111 +	mov	$ws1, CX
   3.112 +lzd1:
   3.113 +	pushw	$2048/2
   3.114 +	loop	lzd1
   3.115 +	mov	SP, BP
   3.116 +	movb	$((LOCALS+3)/4)*2, %cl
   3.117 +initlocals:
   3.118 +	pushl	$1
   3.119 +	loop	initlocals
   3.120 +
   3.121 +#ifndef FLAT32
   3.122 +	movb	$4, %cl
   3.123 +	movw	%es, %bx
   3.124 +	shrw	%cl, %bx
   3.125 +	movw	%es, %dx
   3.126 +	shlw	%cl, %dx
   3.127 +	addw	%dx, %di
   3.128 +	movw	%di, outStream(%bp)
   3.129 +	adcb	%bh, outStream+2(%bp)
   3.130 +	incw	%cx
   3.131 +#else
   3.132 +	movb	$5, %cl
   3.133 +	movl	%edi, outStream(%ebp)
   3.134 +#endif
   3.135 +
   3.136 +//   Byte previousByte = 0;
   3.137 +	xor	BX, BX
   3.138 +
   3.139 +// #define RC_INIT(buffer) 
   3.140 +//    Buffer = buffer; Code = 0; Range = 0xFFFFFFFF; 
   3.141 +//    { int i; for(i=0; i<5; i++) { Code = (Code<<8) | RC_READ_BYTE; }}
   3.142 +//   }
   3.143 +//   RC_INIT(inStream);
   3.144 +
   3.145 +	add	$13, SI		// skip header
   3.146 +setrep:
   3.147 +	call	RC_LOAD_BYTE
   3.148 +	decb	Range(BP)
   3.149 +	loop	setrep
   3.150 +
   3.151 +lzdmainlp:
   3.152 +//   while(1) {
   3.153 +//     CProb *prob;
   3.154 +//     int posState = (int)((nowPos) & posStateMask);
   3.155 +// 
   3.156 +//     prob = p + IsMatch /*0*/ + (state << kNumPosBitsMax /*4*/) + posState;
   3.157 +//     if (Bit0(prob)) { /* char */
   3.158 +
   3.159 +	xor	DX, DX
   3.160 +	call	Bit1state	// Bit1(dx + (state << kNumPosBitsMax /*4*/) + posState)
   3.161 +	mov	$state, DI
   3.162 +	jc	lzdstring
   3.163 +
   3.164 +//       prob = p + Literal /*1846*/ + (LZMA_LIT_SIZE /*768*/ * 
   3.165 +// 	((((nowPos) & literalPosMask) << lc) + (previousByte >> (8 - lc))));
   3.166 +
   3.167 +#if PROP_LC != 0
   3.168 +	shrb	$8-PROP_LC, %bl
   3.169 +#endif
   3.170 +
   3.171 +#if PROP_LP != 0
   3.172 +	movb	posState2(BP), %dl
   3.173 +	shl	$PROP_LC, DX
   3.174 +	movb	$0, %bh
   3.175 +	add	BX, DX
   3.176 +#endif
   3.177 +
   3.178 +	movb	$3, %ah
   3.179 +	mul	BX		// dx = 3*bh
   3.180 +	add	$1846, AX
   3.181 +
   3.182 +//       int symbol = 1;
   3.183 +
   3.184 +	CWD
   3.185 +	inc	DX		// symbol = 1
   3.186 +	xchg	AX, CX		// save prob
   3.187 +
   3.188 +//       if (state >= kNumLitStates /*7*/) { /* previous was string */
   3.189 +//       if (state < 4) state = 0;
   3.190 +
   3.191 +lzd6z:
   3.192 +	subb	$3, (BP, DI)
   3.193 +
   3.194 +//       if (state < 4) state = 0;
   3.195 +
   3.196 +	jnc	lzd6
   3.197 +	movb	%dh, (BP, DI)	// %dh = 0
   3.198 +
   3.199 +lzd6:
   3.200 +//       else if (state < 10) state -= 3;
   3.201 +
   3.202 +	cmpb	$10-3, (BP, DI)
   3.203 +	
   3.204 +//       else state -= 6;
   3.205 +
   3.206 +	jnb	lzd6z
   3.207 +	cmpb	$7-3-1, (BP, DI)
   3.208 +	jbe	lzd3
   3.209 +	
   3.210 +//         int matchByte = outStream[nowPos - rep0];
   3.211 +
   3.212 +	call	DicoRep02ESDI	// %bl = outStream[nowPos - rep0];
   3.213 +	
   3.214 +//         do {
   3.215 +//           int bit;
   3.216 +//           CProb *probLit;
   3.217 +//           matchByte <<= 1; bit = (matchByte & 0x100);
   3.218 +
   3.219 +	movb	$1, %bh
   3.220 +lzd4:
   3.221 +	shlb	$1, %bl			// matchByte <<= 1
   3.222 +	sbb	DI, DI			// save bit=C
   3.223 +
   3.224 +//           probLit = prob + 0x100 + bit + symbol;
   3.225 +
   3.226 +	mov	CX, AX			// restore prob
   3.227 +	adcb	%bh, %ah		// + bit + 0x100
   3.228 +	
   3.229 +//           RC_GET_BIT2(probLit, symbol, if (bit) break, if (!bit) break)
   3.230 +
   3.231 +	call	Bit1axdx		// C,%ax = Bit1(prob+%ax)
   3.232 +	rclb	$1, %dl			// symbol <<= 1; symbol |= C
   3.233 +	jc	lzd5			// if symbol >= 0x100
   3.234 +	cmp	DI, AX
   3.235 +	jz	lzd4			// if bit == Bit1(prob+%ax)
   3.236 +
   3.237 +//         } while (symbol < 0x100);
   3.238 +//       }
   3.239 +lzd3:
   3.240 +//       while (symbol < 0x100) {
   3.241 +//         CProb *probLit = prob + symbol;
   3.242 +//         RC_GET_BIT(probLit, symbol)
   3.243 +//       }
   3.244 +
   3.245 +	xor	BX, BX
   3.246 +	jmp	lzd4
   3.247 +lzd5:
   3.248 +
   3.249 +//       outStream[nowPos++] = previousByte = (Byte)symbol;
   3.250 +
   3.251 +	xchg	AX, DX
   3.252 +	call	outchar		// %bl = outStream[nowPos++] = %al;
   3.253 +	jmp	lzdmainlp
   3.254 +
   3.255 +//     }
   3.256 +
   3.257 +lzdstring:
   3.258 +	mov	$1, CX
   3.259 +
   3.260 +//     else { /* string */
   3.261 +//       prob = p + IsRep /*192*/ + state;
   3.262 +
   3.263 +	movb	$192, %dl
   3.264 +	addb	(BP, DI), %dl
   3.265 +	mov	$rep0, DI
   3.266 +
   3.267 +//       if (Bit0(prob)) {
   3.268 +
   3.269 +	call	Bit1dx		// Bit1(prob)
   3.270 + 	jc	lzd8
   3.271 +
   3.272 +//         rep3 = rep2; rep2 = rep1; rep1 = rep0;
   3.273 +//         state = (state < kNumLitStates /*7*/) ? 0 : 3;
   3.274 +
   3.275 +	stc
   3.276 +
   3.277 +//         prob = p + LenCoder /*818*/;
   3.278 +
   3.279 +	mov	$818, DX
   3.280 +
   3.281 +//       }
   3.282 +
   3.283 +	jmp	lzd11a
   3.284 +
   3.285 +//       else {
   3.286 +lzd8:
   3.287 +//         prob += kNumStates /*12*/;
   3.288 +//         if (Bit0(prob)) {
   3.289 +	call	Bit1dx12	// prob += 12; Bit1(prob)
   3.290 +	jc	lzd11
   3.291 +//           prob = p + IsRep0Long /*240*/ + (state << kNumPosBitsMax /*4*/) 
   3.292 +// 		   + posState;
   3.293 +	movb	$240, %dl	// dh=0
   3.294 +
   3.295 +//           if (Bit0(prob)) {
   3.296 +
   3.297 +	call	Bit1state	// Bit1(dx + (state << kNumPosBitsMax /*4*/) + posState)
   3.298 +	jc	lzd12
   3.299 +
   3.300 +//             // if (nowPos == 0) return LZMA_RESULT_DATA_ERROR;
   3.301 +//             state = (state < kNumLitStates /*7*/) ? 9 : 11;
   3.302 +
   3.303 +	movb	$9, %dl
   3.304 +
   3.305 +//             len++; goto string;
   3.306 +	jmp	lzd13string	// ax = 0
   3.307 +//           }
   3.308 +//         }
   3.309 +//         else {
   3.310 +lzd11:
   3.311 +//           UInt32 distance = rep1;
   3.312 +//           prob += kNumStates /*12*/;
   3.313 +//           if (!Bit0(prob)) {
   3.314 +
   3.315 +	call	Bit1dx12	// prob += 12; Bit1(prob)
   3.316 +	jnc	lzd11z
   3.317 +
   3.318 +//             prob += kNumStates /*12*/;
   3.319 +//             if (Bit0(prob)) distance = rep2;
   3.320 +
   3.321 +	call	Bit1dx12	// prob += 12; Bit1(prob)
   3.322 +lzd11a:
   3.323 +	adcb	%cl, %cl
   3.324 +	
   3.325 +//             else { distance = rep3; rep3 = rep2; }
   3.326 +//             rep2 = rep1;
   3.327 +//           }
   3.328 +//           rep1 = rep0; rep0 = distance;
   3.329 +
   3.330 +lzd11z:
   3.331 +	shl	$2, CX		// 8->32 bits
   3.332 +	sub	CX, DI		// &rep[cx]
   3.333 +	movl	(BP, DI), %eax
   3.334 +rotreplp:
   3.335 +	movb	4(BP, DI), %bl
   3.336 +	movb	%bl, (BP, DI)
   3.337 +	inc	DI
   3.338 +	loop	rotreplp
   3.339 +	testb	%dh, %dh
   3.340 +	jnz	lzd10
   3.341 +	movl	%eax, (BP, DI)
   3.342 +
   3.343 +//         }
   3.344 +lzd12:
   3.345 +//         state = (state < kNumLitStates /*7*/) ? 8 : 11;
   3.346 +
   3.347 +	movb	$0x08, %cl
   3.348 +
   3.349 +//         prob = p + RepLenCoder /*1332*/;
   3.350 +
   3.351 +	mov	$1332, DX
   3.352 +
   3.353 +//       }
   3.354 +lzd10:
   3.355 +	push	CX		// CX = 0
   3.356 +
   3.357 +//       { /* get len */
   3.358 +//         int numBits, offset;
   3.359 +//         CProb *probLen = prob + LenChoice /*0*/;
   3.360 +//         numBits = kLenNumLowBits /*3*/;
   3.361 +
   3.362 +	movb	$8, %cl		// numBits : 3,3,8
   3.363 +
   3.364 +//         if (Bit0(probLen)) {
   3.365 +
   3.366 +	call	Bit1dx		// Bit1(prob)
   3.367 +	xchg	AX, BX
   3.368 +	inc	DX
   3.369 +	jnc	lzd15		// bx=0
   3.370 +
   3.371 +//           probLen = prob + LenLow/*2*/ + (posState << kLenNumLowBits/*3*/);
   3.372 +//           offset = 0;
   3.373 +//         }
   3.374 +//         else {
   3.375 +//           probLen = prob + LenChoice2 /*1*/;
   3.376 +
   3.377 +	call	Bit1dx		// Bit1(prob)
   3.378 +	add	AX, BX
   3.379 +
   3.380 +#if PROP_PB != 0
   3.381 +	inc	AX		// ah=0
   3.382 +#endif
   3.383 +	jc	lzd16		// %ax=0, %bx=-2 
   3.384 +lzd15:
   3.385 +#if PROP_PB != 0
   3.386 +	movb	$8, %al
   3.387 +	mulb	posState(BP)
   3.388 +#endif
   3.389 +
   3.390 +//           if (Bit0(probLen)) {
   3.391 +//             probLen = prob + LenMid/*130*/ + (posState << kLenNumMidBits/*3*/);
   3.392 +
   3.393 +	movb	$3, %cl		// numBits : 3,3,8
   3.394 +lzd16:
   3.395 +#if PROP_PB != 0
   3.396 +	add	$2-128-1, AX	// probLen : 2,130,258
   3.397 +#else
   3.398 +	mov	$2-128-1, AX	// probLen : 2,130,258
   3.399 +#endif
   3.400 +	add	DX, AX
   3.401 +	mov	$-8+1, DX	// offset  : 0,8,16
   3.402 +lzdargslp:
   3.403 +	add	$8, DX
   3.404 +	add	$128, AX
   3.405 +	inc	BX
   3.406 +	jle	lzdargslp	// leave with bx=1
   3.407 +
   3.408 +//             offset = kLenNumLowSymbols /*8*/;
   3.409 +//             //numBits = kLenNumMidBits /*3*/;
   3.410 +//           }
   3.411 +//           else {
   3.412 +//             probLen = prob + LenHigh /*258*/;
   3.413 +//             offset = kLenNumLowSymbols /*8*/ + kLenNumMidSymbols /*8*/;
   3.414 +//             numBits = kLenNumHighBits /*8*/;
   3.415 +//           }
   3.416 +//         }
   3.417 +//         RangeDecoderBitTreeDecode(probLen, numBits, len); len += offset;
   3.418 +
   3.419 +	push	DX
   3.420 +	call	RangeDecoder	// %ax=probs, %cx=numLevels, %ax=res
   3.421 +	pop	DX
   3.422 +	add	DX, AX		// offset
   3.423 +	pop	DX		// 0
   3.424 +lzd13string:
   3.425 +	push	AX
   3.426 +
   3.427 +// state = (state < kNumLitStates /*7*/) ? dl : dl|3;
   3.428 +
   3.429 +	movb	$7, %cl
   3.430 +	cmpb	%cl, state(BP)
   3.431 +	jb	new_state
   3.432 +	orb	$3, %dl
   3.433 +new_state:
   3.434 +	movb	%dl, state(BP)
   3.435 +
   3.436 +//       } /* get len */
   3.437 +//       if (state < 4) {
   3.438 +
   3.439 +	cmpb	$4-1, %dl
   3.440 +	ja	lzd19
   3.441 +
   3.442 +//         int posSlot;
   3.443 +//         state += kNumLitStates /*7*/;
   3.444 +
   3.445 +	addb	%cl, state(BP)
   3.446 +
   3.447 +//         prob = p + PosSlot /*432*/ + (((len < kNumLenToPosStates /*4*/) ? 
   3.448 +// 		len : kNumLenToPosStates - 1) << kNumPosSlotBits /*6*/);
   3.449 +
   3.450 +	cmp	$4+1, AX
   3.451 +	jb	lzd21
   3.452 +	mov	$3+1, AX
   3.453 +	//??movb	$3+1, %al
   3.454 +
   3.455 +lzd21:
   3.456 +
   3.457 +	dec	CX		// cx = 6
   3.458 +	shl	%cl, AX
   3.459 +	add	$432-64, AX
   3.460 +
   3.461 +//         RangeDecoderBitTreeDecode(prob, kNumPosSlotBits /*6*/, posSlot);
   3.462 +
   3.463 +	call	RangeDecoder	// %ax=probs, %cx=numLevels, %ax=res
   3.464 +
   3.465 +//         if (posSlot >= kStartPosModelIndex /*4*/) {
   3.466 +//           int numDirectBits = ((posSlot >> 1) - 1);
   3.467 +
   3.468 +#ifndef FLAT32
   3.469 +	movw	%cx, 2(%bp, %di)	// %cx = 0
   3.470 +#endif
   3.471 +	mov	AX, (BP, DI)
   3.472 +	mov	AX, CX
   3.473 +	shrw	$1, CX
   3.474 +	dec	CX
   3.475 +	cmpb	$4, %al
   3.476 +	jb	lzd22
   3.477 +
   3.478 +//           rep0 = (2 | ((UInt32)posSlot & 1));
   3.479 +
   3.480 +	andb	%bl, (BP, DI)		// %bx=1
   3.481 +	orb	$2, (BP, DI)
   3.482 +
   3.483 +//           if (posSlot < kEndPosModelIndex /*14*/) {
   3.484 +
   3.485 +	cmpb	$14, %al
   3.486 +	jnb	lzd23
   3.487 +
   3.488 +//             rep0 <<= numDirectBits;
   3.489 +
   3.490 +	neg	AX
   3.491 +	shll	%cl, (BP, DI)
   3.492 +	add	(BP, DI), AX
   3.493 +
   3.494 +//             prob = p + SpecPos /*688*/ + rep0 - posSlot - 1;
   3.495 +
   3.496 +	add	$687, AX
   3.497 +	jmp	lzd24
   3.498 +
   3.499 +//           }
   3.500 +//           else {
   3.501 +lzd23:
   3.502 +//             numDirectBits -= kNumAlignBits /*4*/;
   3.503 +//             do {
   3.504 +//               RC_NORMALIZE; Range >>= 1; rep0 <<= 1;
   3.505 +//               if (Code >= Range) { Code -= Range; rep0 |= 1; }
   3.506 +
   3.507 +lzd23z:
   3.508 +	call	RC_NORMALIZE
   3.509 +	shrl	$1, Range(BP)
   3.510 +	movl	Range(BP), %eax
   3.511 +	cmpl	Code(BP), %eax
   3.512 +	ja	lzd25
   3.513 +	subl	%eax, Code(BP)
   3.514 +	stc
   3.515 +lzd25:
   3.516 +	rcll	$1, (BP, DI)
   3.517 +
   3.518 +//             } while (--numDirectBits != 0);
   3.519 +
   3.520 +	cmp	$4+1, CX
   3.521 +	loopne	lzd23z
   3.522 +
   3.523 +//             prob = p + Align /* 802 */; numDirectBits = kNumAlignBits /*4*/;
   3.524 +//             rep0 <<= numDirectBits;
   3.525 +
   3.526 +	shll	%cl, (BP, DI)
   3.527 +	mov	$802, AX
   3.528 +//           }
   3.529 +
   3.530 +lzd24:
   3.531 +	call	RangeDecoder	// %ax=probs, %cx=numLevels, %ax=res
   3.532 +
   3.533 +//           {
   3.534 +//             int i = 1, mi = 1;
   3.535 +//             do {
   3.536 +//               CProb *prob3 = prob + mi;
   3.537 +//               RC_GET_BIT2(prob3, mi, ; , rep0 |= i);
   3.538 +
   3.539 +	orb	%dh, (BP, DI)	// update rep0 with DirectBits
   3.540 +
   3.541 +//               i <<= 1;
   3.542 +//             } while(--numDirectBits != 0);
   3.543 +//           }
   3.544 +//         } else rep0 = posSlot;
   3.545 +lzd22:
   3.546 +//         if (++rep0 == (UInt32)(0)) break; /* EOF */
   3.547 +
   3.548 +	incl	(BP, DI)
   3.549 +
   3.550 +lzd19:
   3.551 +	pop	CX
   3.552 +	jz	lzdone
   3.553 +
   3.554 +//       }
   3.555 +//       len += kMatchMinLen;/*2*/
   3.556 +
   3.557 +	inc	CX
   3.558 +
   3.559 +//     string: // if (rep0 > nowPos) return LZMA_RESULT_DATA_ERROR;
   3.560 +//       do {
   3.561 +lzd13z:
   3.562 +//         previousByte = outStream[nowPos - rep0];
   3.563 +//         outStream[nowPos++] = previousByte;
   3.564 +
   3.565 +	call	outcharDico 	// %bl = outStream[nowPos++] = outStream[nowPos - rep0]
   3.566 +
   3.567 +//       } while(--len != 0);
   3.568 +
   3.569 +	loop	lzd13z
   3.570 +
   3.571 +//     } /* char/string */
   3.572 +//   }
   3.573 +
   3.574 +	jmp	lzdmainlp
   3.575 +
   3.576 +lzdone:
   3.577 +//   //RC_NORMALIZE;
   3.578 +//   //*inSizeProcessed = (SizeT)(Buffer - inStream); *outSizeProcessed = nowPos;
   3.579 +//   return LZMA_RESULT_OK;
   3.580 +	call	Dico2ESDI	// set es & di (rep0 = 0)
   3.581 +	lea	ws2(BP), SP	// dealloc
   3.582 +	ret	
   3.583 +// }
   3.584 +
   3.585 +// al = outStream[nowPos - rep0];
   3.586 +
   3.587 +/*
   3.588 + * output  es:di, al
   3.589 + * scratch bh, cl, flags
   3.590 + */
   3.591 +
   3.592 +DicoRep02ESDI:
   3.593 +	stc
   3.594 +
   3.595 +// bl = outStream[nowPos];
   3.596 +
   3.597 +/*
   3.598 + * output  es:di, bl
   3.599 + * scratch bh, cl, flags
   3.600 + */
   3.601 + 
   3.602 +Dico2ESDI:
   3.603 +#ifndef FLAT32
   3.604 +	movl	nowPos(%bp), %ebx
   3.605 +	jnc	Dico2ESDIz
   3.606 +	subl	rep0(%bp), %ebx
   3.607 +Dico2ESDIz:
   3.608 +	movw	%bx, %di
   3.609 +	xorw	%bx, %bx
   3.610 +	shrl	$4, %ebx
   3.611 +	movw	%bx, %es
   3.612 +	movb	%es:(%di), %bl
   3.613 +#else
   3.614 +	movl	nowPos(%bp), %edi
   3.615 +	jnc	Dico2ESDIz
   3.616 +	subl	rep0(%bp), %edi
   3.617 +Dico2ESDIz:
   3.618 +	movb	(%edi), %bl
   3.619 +#endif
   3.620 +	ret
   3.621 +
   3.622 +outcharDico:
   3.623 +
   3.624 +// bl = outStream[nowPos++] = outStream[nowPos - rep0]
   3.625 +
   3.626 +/*
   3.627 + * output  es:di, bl
   3.628 + * update  nowPos
   3.629 + * scratch ax, dx, bh, cl, flags
   3.630 + */
   3.631 +
   3.632 +	call	DicoRep02ESDI	// %bl = outStream[nowPos - rep0]
   3.633 +	xchg	AX, BX
   3.634 +outchar:
   3.635 +
   3.636 +// bl = outStream[nowPos++] = previousByte = al;
   3.637 +
   3.638 +/*
   3.639 + * output  bl
   3.640 + * update  nowPos
   3.641 + * scratch ax, dx, bh, di, cl, flags
   3.642 + */
   3.643 +
   3.644 +	clc
   3.645 +	call	Dico2ESDI
   3.646 +	stosb
   3.647 +	xchg	AX, BX		// previous byte
   3.648 +
   3.649 +//	int posState = (int)((nowPos) & posStateMask);
   3.650 +
   3.651 +#if PROP_PB != 0 && PROP_LP != 0
   3.652 +	addw	$0x0101, posState2(BP)
   3.653 +	andb	$(((1 << PROP_PB) -1)<<8)+((1 << PROP_LP) -1), posState2(BP)
   3.654 +#else
   3.655 +# if PROP_PB != 0
   3.656 +	incb	posState(BP)
   3.657 +	andb	$((1 << PROP_PB) -1), posState(BP)
   3.658 +# endif
   3.659 +# if PROP_LP != 0
   3.660 +	incb	posState2(BP)
   3.661 +	andb	$((1 << PROP_LP) -1), posState2(BP)
   3.662 +# endif
   3.663 +#endif
   3.664 +	incl	nowPos(BP)
   3.665 +	ret
   3.666 +
   3.667 +//  
   3.668 +// #define RC_NORMALIZE if (Range < kTopValue) 
   3.669 +//    { Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
   3.670 +
   3.671 +/*
   3.672 + * update  Range, Code, ds:si
   3.673 + * scratch flags
   3.674 + */
   3.675 +
   3.676 +RC_NORMALIZE:
   3.677 +	cmpb	$0, Range+3(BP)
   3.678 +	jne	RC_NORMALIZE_1
   3.679 +RC_LOAD_BYTE:
   3.680 +	push	AX
   3.681 +	shll	$8, Range(BP)
   3.682 +	shll	$8, Code(BP)
   3.683 +#ifndef FLAT32
   3.684 +	testw	%si, %si
   3.685 +	jns	RC_READ_BYTE
   3.686 +	movw	%ds, %ax
   3.687 +	incw	%ax
   3.688 +	movw	%ax, %ds
   3.689 +	addw	$-16, %si
   3.690 +RC_READ_BYTE:
   3.691 +#endif
   3.692 +	lodsb
   3.693 +	movb	%al, Code(BP)
   3.694 +	pop	AX
   3.695 +RC_NORMALIZE_1:
   3.696 +	ret
   3.697 +
   3.698 +// Bit1(dx + (state << kNumPosBitsMax /*4*/) + posState)
   3.699 +
   3.700 +Bit1state:
   3.701 +	movb	$16, %al
   3.702 +	mulb	state(BP)
   3.703 +# if PROP_PB != 0
   3.704 +	addb	posState(BP), %al
   3.705 +# endif
   3.706 +Bit1axdx:
   3.707 +	add	DX, AX
   3.708 +	jmp	Bit1
   3.709 +
   3.710 +// prob += 12; Bit1(prob)
   3.711 +
   3.712 +Bit1dx12:
   3.713 +	add	$12, DX
   3.714 +Bit1dx:
   3.715 +	mov	DX, AX
   3.716 +
   3.717 +// static int Bit1(CProb *p)
   3.718 +
   3.719 +Bit1:
   3.720 +/*
   3.721 + * input   ax=p
   3.722 + * output  C, ax
   3.723 + * update  bound, Range, Code, ds:si
   3.724 + * scratch flags
   3.725 + */
   3.726 + 
   3.727 +// {
   3.728 +// 	RC_NORMALIZE;
   3.729 +
   3.730 +	call  RC_NORMALIZE		// kill %ax, update %si
   3.731 +
   3.732 +	pushal		// FIXME pushaw?
   3.733 +
   3.734 +	xchg	AX, DI
   3.735 +	add	DI, DI			// short *
   3.736 +	
   3.737 +
   3.738 +// 	bound = (Range>>kNumBitModelTotalBits /*11*/) * *(p);
   3.739 +
   3.740 +	movl	Range(BP), %eax
   3.741 +	shrl	$11, %eax
   3.742 +	movzwl	(BP, DI), %edx
   3.743 +	mull	%edx
   3.744 +
   3.745 +// 	if (Code < bound) {
   3.746 +
   3.747 +	cmpl	Code(BP), %eax
   3.748 +	jbe	Bit1_1
   3.749 +
   3.750 +//    		Range = bound;
   3.751 +
   3.752 +	movl	%eax, Range(BP)
   3.753 +
   3.754 +// 		*(p) += (kBitModelTotal /*2048*/ - *(p)) >> kNumMoveBits /*5*/;
   3.755 +
   3.756 +	movw	$2048, %ax
   3.757 +
   3.758 +// 		return 0;
   3.759 +
   3.760 +	jmp	Bit1_2
   3.761 +
   3.762 +//	}
   3.763 +// 	else {
   3.764 +
   3.765 +Bit1_1:
   3.766 +
   3.767 +//    		Range -= bound; Code -= bound;
   3.768 +
   3.769 +	subl	%eax, Range(BP)
   3.770 +	subl	%eax, Code(BP)
   3.771 +
   3.772 +// 		*(p) -= (*(p)) >> kNumMoveBits /*5*/;
   3.773 +
   3.774 +	movw	$31, %ax
   3.775 +
   3.776 +// 		return 1;
   3.777 +
   3.778 +	stc
   3.779 +Bit1_2:
   3.780 +	pushf
   3.781 +	subw	(BP, DI), %ax
   3.782 +	sarw	$5, %ax
   3.783 +	addw	%ax, (BP, DI)
   3.784 +	popf
   3.785 +	popal		// FIXME popaw?
   3.786 +	sbb	AX, AX
   3.787 +
   3.788 +// 	}
   3.789 +// }
   3.790 +
   3.791 +	ret
   3.792 +
   3.793 +RangeDecoder:
   3.794 +
   3.795 +/*
   3.796 + * input   ax=probs cx=numLevels (< 8) bx=1
   3.797 + * output  ax=res (backward), dh (forward)
   3.798 + * update  bound, Range, Code, ds:si
   3.799 + * scratch flags, cx=0, dl
   3.800 + */
   3.801 + 
   3.802 +	push	BX
   3.803 +	
   3.804 +//   { int i = numLevels; res = 1; 
   3.805 +	mov	BX, DX		// res = 1
   3.806 +	
   3.807 +//   do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); 
   3.808 +
   3.809 +RangeDecoder_1:
   3.810 +	push	AX
   3.811 +	call	Bit1axdx		// C,%ax = Bit1(prob+%ax)
   3.812 +	rclb	$1, %dl			// res <<= 1; res |= C
   3.813 +	andb	%bl, %al		// current bit
   3.814 +	orb	%al, %bh		// store in bh
   3.815 +	shlb	$1, %bl			// update max
   3.816 +	pop	AX
   3.817 +	loop	RangeDecoder_1
   3.818 +
   3.819 +//   res -= (1 << numLevels); }
   3.820 +
   3.821 +	xchg	AX, BX			// move bh to dh
   3.822 +	xchg	AX, DX			// and dl to al
   3.823 +	sub	%dl, %al		// sub max
   3.824 +	pop	BX
   3.825 +	ret
     4.1 --- a/syslinux/receipt	Sat Aug 25 11:17:45 2012 +0200
     4.2 +++ b/syslinux/receipt	Sun Aug 26 00:21:22 2012 +0200
     4.3 @@ -48,6 +48,7 @@
     4.4  	        [ -e $src/$i.kbd ] || continue
     4.5  		cat >> $fs/boot/isolinux/i18n.cfg <<EOT
     4.6  
     4.7 +# ${kbd/,/.kbd or }.kbd keyboard
     4.8  LABEL $label
     4.9  	MENU LABEL $menu
    4.10  	com32 c32box.c32