mirror of
https://github.com/microsoft/Microsoft-3D-Movie-Maker.git
synced 2024-11-25 03:33:22 +01:00
3278 lines
42 KiB
C
3278 lines
42 KiB
C
/* Copyright (c) Microsoft Corporation.
|
|
Licensed under the MIT License. */
|
|
|
|
/* Copyright (c) Microsoft Corporation.
|
|
Licensed under the MIT License. */
|
|
|
|
// Setup
|
|
long cbTot;
|
|
byte *pbLimDst = (byte *)pvDst + cbDst;
|
|
byte *pbLimSrc = (byte *)pvSrc + cbSrc - kcbTailKcd2;
|
|
|
|
__asm
|
|
{
|
|
mov edi,pvDst
|
|
mov ebx,pvSrc
|
|
inc ebx
|
|
mov eax,[ebx]
|
|
add ebx,4
|
|
jmp LBlock0
|
|
|
|
LLitDword7:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
mov eax,ecx
|
|
shr ecx,2
|
|
and eax,3
|
|
rep movsd
|
|
mov ecx,eax
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
jmp LBlock0
|
|
|
|
L6BitOffDword0:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,2
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
cmp esi,4
|
|
jb LCopyByte0
|
|
jmp LCopyDword0
|
|
|
|
L9BitOffDword4:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,7
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword0
|
|
|
|
L12BitOffDword0:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,4
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword0
|
|
|
|
L20BitOffDword0:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,4
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyDword0
|
|
|
|
// Copy Dword 0
|
|
LCopyDword0:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
mov edx,ecx
|
|
shr ecx,2
|
|
and edx,3
|
|
rep movsd
|
|
mov ecx,edx
|
|
rep movsb
|
|
jmp LBlock0
|
|
|
|
LLitSingle7:
|
|
#ifdef SAFETY
|
|
cmp edi,pbLimDst
|
|
jae LFail
|
|
#endif //SAFETY
|
|
mov [edi],ah
|
|
inc edi
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LBlock0
|
|
|
|
LLitByte7:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
jmp LBlock0
|
|
|
|
L6BitOffByte0:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,2
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte0
|
|
|
|
L9BitOffByte4:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,7
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte0
|
|
|
|
L12BitOffByte0:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,4
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte0
|
|
|
|
L20BitOffByte0:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,4
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyByte0
|
|
|
|
// Copy Byte 0
|
|
LCopyByte0:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
rep movsb
|
|
|
|
// Block 0
|
|
LBlock0:
|
|
test al,1
|
|
jz LLen0_0
|
|
test al,2
|
|
jz LLen0_1
|
|
test al,4
|
|
jz LLen0_2
|
|
test al,8
|
|
jz LLen0_3
|
|
test al,16
|
|
jz LLen0_4
|
|
test al,32
|
|
jz LLen0_5
|
|
test al,64
|
|
jz LLen0_6
|
|
test al,128
|
|
jz LLen0_7
|
|
test ah,1
|
|
jz LLen0_8
|
|
test ah,2
|
|
jz LLen0_9
|
|
test ah,4
|
|
jz LLen0_10
|
|
test ah,8
|
|
jz LLen0_11
|
|
jmp LDone
|
|
LLen0_0:
|
|
mov ecx,1
|
|
test al,2
|
|
jz LLitSingle1
|
|
test al,4
|
|
jz L6BitOffByte1
|
|
test al,8
|
|
jz L9BitOffByte1
|
|
test al,16
|
|
jz L12BitOffByte1
|
|
jmp L20BitOffByte1
|
|
LLen0_1:
|
|
mov ecx,eax
|
|
shr ecx,2
|
|
and ecx,1
|
|
or ecx,2
|
|
test al,8
|
|
jz LLitByte3
|
|
test al,16
|
|
jz L6BitOffByte3
|
|
test al,32
|
|
jz L9BitOffByte3
|
|
test al,64
|
|
jz L12BitOffByte3
|
|
jmp L20BitOffByte3
|
|
LLen0_2:
|
|
mov ecx,eax
|
|
shr ecx,3
|
|
and ecx,3
|
|
or ecx,4
|
|
test al,32
|
|
jz LLitByte5
|
|
test al,64
|
|
jz L6BitOffByte5
|
|
test al,128
|
|
jz L9BitOffByte5
|
|
test ah,1
|
|
jz L12BitOffByte5
|
|
jmp L20BitOffByte5
|
|
LLen0_3:
|
|
mov ecx,eax
|
|
shr ecx,4
|
|
and ecx,7
|
|
or ecx,8
|
|
test al,128
|
|
jz LLitDword7
|
|
test ah,1
|
|
jz L6BitOffDword7
|
|
test ah,2
|
|
jz L9BitOffDword7
|
|
test ah,4
|
|
jz L12BitOffDword7
|
|
jmp L20BitOffDword7
|
|
LLen0_4:
|
|
mov ecx,eax
|
|
shr ecx,5
|
|
and ecx,15
|
|
or ecx,16
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,2
|
|
jz LLitDword1
|
|
test al,4
|
|
jz L6BitOffDword1
|
|
test al,8
|
|
jz L9BitOffDword1
|
|
test al,16
|
|
jz L12BitOffDword1
|
|
jmp L20BitOffDword1
|
|
LLen0_5:
|
|
mov ecx,eax
|
|
shr ecx,6
|
|
and ecx,31
|
|
or ecx,32
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,8
|
|
jz LLitDword3
|
|
test al,16
|
|
jz L6BitOffDword3
|
|
test al,32
|
|
jz L9BitOffDword3
|
|
test al,64
|
|
jz L12BitOffDword3
|
|
jmp L20BitOffDword3
|
|
LLen0_6:
|
|
mov ecx,eax
|
|
shr ecx,7
|
|
and ecx,63
|
|
or ecx,64
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,32
|
|
jz LLitDword5
|
|
test al,64
|
|
jz L6BitOffDword5
|
|
test al,128
|
|
jz L9BitOffDword5
|
|
test ah,1
|
|
jz L12BitOffDword5
|
|
jmp L20BitOffDword5
|
|
LLen0_7:
|
|
mov ecx,eax
|
|
shr ecx,8
|
|
and ecx,127
|
|
or ecx,128
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,128
|
|
jz LLitDword7
|
|
test ah,1
|
|
jz L6BitOffDword7
|
|
test ah,2
|
|
jz L9BitOffDword7
|
|
test ah,4
|
|
jz L12BitOffDword7
|
|
jmp L20BitOffDword7
|
|
LLen0_8:
|
|
mov ecx,eax
|
|
shr ecx,9
|
|
and ecx,255
|
|
or ecx,256
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,2
|
|
jz LLitDword1
|
|
test al,4
|
|
jz L6BitOffDword1
|
|
test al,8
|
|
jz L9BitOffDword1
|
|
test al,16
|
|
jz L12BitOffDword1
|
|
jmp L20BitOffDword1
|
|
LLen0_9:
|
|
mov ecx,eax
|
|
shr ecx,10
|
|
and ecx,511
|
|
or ecx,512
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,8
|
|
jz LLitDword3
|
|
test al,16
|
|
jz L6BitOffDword3
|
|
test al,32
|
|
jz L9BitOffDword3
|
|
test al,64
|
|
jz L12BitOffDword3
|
|
jmp L20BitOffDword3
|
|
LLen0_10:
|
|
mov ecx,eax
|
|
shr ecx,11
|
|
and ecx,1023
|
|
or ecx,1024
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,32
|
|
jz LLitDword5
|
|
test al,64
|
|
jz L6BitOffDword5
|
|
test al,128
|
|
jz L9BitOffDword5
|
|
test ah,1
|
|
jz L12BitOffDword5
|
|
jmp L20BitOffDword5
|
|
LLen0_11:
|
|
mov ecx,eax
|
|
shr ecx,12
|
|
and ecx,2047
|
|
or ecx,2048
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,128
|
|
jz LLitDword7
|
|
test ah,1
|
|
jz L6BitOffDword7
|
|
test ah,2
|
|
jz L9BitOffDword7
|
|
test ah,4
|
|
jz L12BitOffDword7
|
|
jmp L20BitOffDword7
|
|
|
|
LLitDword0:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,1
|
|
and edx,127
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
mov eax,ecx
|
|
shr ecx,2
|
|
and eax,3
|
|
rep movsd
|
|
mov ecx,eax
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,7
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock1
|
|
|
|
L6BitOffDword1:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,3
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
cmp esi,4
|
|
jb LCopyByte1
|
|
jmp LCopyDword1
|
|
|
|
L9BitOffDword5:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,8
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword1
|
|
|
|
L12BitOffDword1:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,5
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword1
|
|
|
|
L20BitOffDword1:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,5
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyDword1
|
|
|
|
// Copy Dword 1
|
|
LCopyDword1:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
mov edx,ecx
|
|
shr ecx,2
|
|
and edx,3
|
|
rep movsd
|
|
mov ecx,edx
|
|
rep movsb
|
|
jmp LBlock1
|
|
|
|
LLitSingle0:
|
|
#ifdef SAFETY
|
|
cmp edi,pbLimDst
|
|
jae LFail
|
|
#endif //SAFETY
|
|
mov edx,eax
|
|
shr edx,1
|
|
mov [edi],dl
|
|
inc edi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LBlock1
|
|
|
|
LLitByte0:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,1
|
|
and edx,127
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,7
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock1
|
|
|
|
L6BitOffByte1:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,3
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte1
|
|
|
|
L9BitOffByte5:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,8
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte1
|
|
|
|
L12BitOffByte1:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,5
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte1
|
|
|
|
L20BitOffByte1:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,5
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyByte1
|
|
|
|
// Copy Byte 1
|
|
LCopyByte1:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
rep movsb
|
|
|
|
// Block 1
|
|
LBlock1:
|
|
test al,2
|
|
jz LLen1_0
|
|
test al,4
|
|
jz LLen1_1
|
|
test al,8
|
|
jz LLen1_2
|
|
test al,16
|
|
jz LLen1_3
|
|
test al,32
|
|
jz LLen1_4
|
|
test al,64
|
|
jz LLen1_5
|
|
test al,128
|
|
jz LLen1_6
|
|
test ah,1
|
|
jz LLen1_7
|
|
test ah,2
|
|
jz LLen1_8
|
|
test ah,4
|
|
jz LLen1_9
|
|
test ah,8
|
|
jz LLen1_10
|
|
test ah,16
|
|
jz LLen1_11
|
|
jmp LDone
|
|
LLen1_0:
|
|
mov ecx,1
|
|
test al,4
|
|
jz LLitSingle2
|
|
test al,8
|
|
jz L6BitOffByte2
|
|
test al,16
|
|
jz L9BitOffByte2
|
|
test al,32
|
|
jz L12BitOffByte2
|
|
jmp L20BitOffByte2
|
|
LLen1_1:
|
|
mov ecx,eax
|
|
shr ecx,3
|
|
and ecx,1
|
|
or ecx,2
|
|
test al,16
|
|
jz LLitByte4
|
|
test al,32
|
|
jz L6BitOffByte4
|
|
test al,64
|
|
jz L9BitOffByte4
|
|
test al,128
|
|
jz L12BitOffByte4
|
|
jmp L20BitOffByte4
|
|
LLen1_2:
|
|
mov ecx,eax
|
|
shr ecx,4
|
|
and ecx,3
|
|
or ecx,4
|
|
test al,64
|
|
jz LLitByte6
|
|
test al,128
|
|
jz L6BitOffByte6
|
|
test ah,1
|
|
jz L9BitOffByte6
|
|
test ah,2
|
|
jz L12BitOffByte6
|
|
jmp L20BitOffByte6
|
|
LLen1_3:
|
|
mov ecx,eax
|
|
shr ecx,5
|
|
and ecx,7
|
|
or ecx,8
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,1
|
|
jz LLitDword0
|
|
test al,2
|
|
jz L6BitOffDword0
|
|
test al,4
|
|
jz L9BitOffDword0
|
|
test al,8
|
|
jz L12BitOffDword0
|
|
jmp L20BitOffDword0
|
|
LLen1_4:
|
|
mov ecx,eax
|
|
shr ecx,6
|
|
and ecx,15
|
|
or ecx,16
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,4
|
|
jz LLitDword2
|
|
test al,8
|
|
jz L6BitOffDword2
|
|
test al,16
|
|
jz L9BitOffDword2
|
|
test al,32
|
|
jz L12BitOffDword2
|
|
jmp L20BitOffDword2
|
|
LLen1_5:
|
|
mov ecx,eax
|
|
shr ecx,7
|
|
and ecx,31
|
|
or ecx,32
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,16
|
|
jz LLitDword4
|
|
test al,32
|
|
jz L6BitOffDword4
|
|
test al,64
|
|
jz L9BitOffDword4
|
|
test al,128
|
|
jz L12BitOffDword4
|
|
jmp L20BitOffDword4
|
|
LLen1_6:
|
|
mov ecx,eax
|
|
shr ecx,8
|
|
and ecx,63
|
|
or ecx,64
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,64
|
|
jz LLitDword6
|
|
test al,128
|
|
jz L6BitOffDword6
|
|
test ah,1
|
|
jz L9BitOffDword6
|
|
test ah,2
|
|
jz L12BitOffDword6
|
|
jmp L20BitOffDword6
|
|
LLen1_7:
|
|
mov ecx,eax
|
|
shr ecx,9
|
|
and ecx,127
|
|
or ecx,128
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,1
|
|
jz LLitDword0
|
|
test al,2
|
|
jz L6BitOffDword0
|
|
test al,4
|
|
jz L9BitOffDword0
|
|
test al,8
|
|
jz L12BitOffDword0
|
|
jmp L20BitOffDword0
|
|
LLen1_8:
|
|
mov ecx,eax
|
|
shr ecx,10
|
|
and ecx,255
|
|
or ecx,256
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,4
|
|
jz LLitDword2
|
|
test al,8
|
|
jz L6BitOffDword2
|
|
test al,16
|
|
jz L9BitOffDword2
|
|
test al,32
|
|
jz L12BitOffDword2
|
|
jmp L20BitOffDword2
|
|
LLen1_9:
|
|
mov ecx,eax
|
|
shr ecx,11
|
|
and ecx,511
|
|
or ecx,512
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,16
|
|
jz LLitDword4
|
|
test al,32
|
|
jz L6BitOffDword4
|
|
test al,64
|
|
jz L9BitOffDword4
|
|
test al,128
|
|
jz L12BitOffDword4
|
|
jmp L20BitOffDword4
|
|
LLen1_10:
|
|
mov ecx,eax
|
|
shr ecx,12
|
|
and ecx,1023
|
|
or ecx,1024
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,64
|
|
jz LLitDword6
|
|
test al,128
|
|
jz L6BitOffDword6
|
|
test ah,1
|
|
jz L9BitOffDword6
|
|
test ah,2
|
|
jz L12BitOffDword6
|
|
jmp L20BitOffDword6
|
|
LLen1_11:
|
|
mov ecx,eax
|
|
shr ecx,13
|
|
and ecx,2047
|
|
or ecx,2048
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,1
|
|
jz LLitDword0
|
|
test al,2
|
|
jz L6BitOffDword0
|
|
test al,4
|
|
jz L9BitOffDword0
|
|
test al,8
|
|
jz L12BitOffDword0
|
|
jmp L20BitOffDword0
|
|
|
|
LLitDword1:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,2
|
|
and edx,63
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
mov eax,ecx
|
|
shr ecx,2
|
|
and eax,3
|
|
rep movsd
|
|
mov ecx,eax
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,6
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock2
|
|
|
|
L6BitOffDword2:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,4
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
cmp esi,4
|
|
jb LCopyByte2
|
|
jmp LCopyDword2
|
|
|
|
L9BitOffDword6:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,9
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword2
|
|
|
|
L12BitOffDword2:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,6
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword2
|
|
|
|
L20BitOffDword2:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,6
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyDword2
|
|
|
|
// Copy Dword 2
|
|
LCopyDword2:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
mov edx,ecx
|
|
shr ecx,2
|
|
and edx,3
|
|
rep movsd
|
|
mov ecx,edx
|
|
rep movsb
|
|
jmp LBlock2
|
|
|
|
LLitSingle1:
|
|
#ifdef SAFETY
|
|
cmp edi,pbLimDst
|
|
jae LFail
|
|
#endif //SAFETY
|
|
mov edx,eax
|
|
shr edx,2
|
|
mov [edi],dl
|
|
inc edi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LBlock2
|
|
|
|
LLitByte1:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,2
|
|
and edx,63
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,6
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock2
|
|
|
|
L6BitOffByte2:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,4
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte2
|
|
|
|
L9BitOffByte6:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,9
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte2
|
|
|
|
L12BitOffByte2:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,6
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte2
|
|
|
|
L20BitOffByte2:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,6
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyByte2
|
|
|
|
// Copy Byte 2
|
|
LCopyByte2:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
rep movsb
|
|
|
|
// Block 2
|
|
LBlock2:
|
|
test al,4
|
|
jz LLen2_0
|
|
test al,8
|
|
jz LLen2_1
|
|
test al,16
|
|
jz LLen2_2
|
|
test al,32
|
|
jz LLen2_3
|
|
test al,64
|
|
jz LLen2_4
|
|
test al,128
|
|
jz LLen2_5
|
|
test ah,1
|
|
jz LLen2_6
|
|
test ah,2
|
|
jz LLen2_7
|
|
test ah,4
|
|
jz LLen2_8
|
|
test ah,8
|
|
jz LLen2_9
|
|
test ah,16
|
|
jz LLen2_10
|
|
test ah,32
|
|
jz LLen2_11
|
|
jmp LDone
|
|
LLen2_0:
|
|
mov ecx,1
|
|
test al,8
|
|
jz LLitSingle3
|
|
test al,16
|
|
jz L6BitOffByte3
|
|
test al,32
|
|
jz L9BitOffByte3
|
|
test al,64
|
|
jz L12BitOffByte3
|
|
jmp L20BitOffByte3
|
|
LLen2_1:
|
|
mov ecx,eax
|
|
shr ecx,4
|
|
and ecx,1
|
|
or ecx,2
|
|
test al,32
|
|
jz LLitByte5
|
|
test al,64
|
|
jz L6BitOffByte5
|
|
test al,128
|
|
jz L9BitOffByte5
|
|
test ah,1
|
|
jz L12BitOffByte5
|
|
jmp L20BitOffByte5
|
|
LLen2_2:
|
|
mov ecx,eax
|
|
shr ecx,5
|
|
and ecx,3
|
|
or ecx,4
|
|
test al,128
|
|
jz LLitByte7
|
|
test ah,1
|
|
jz L6BitOffByte7
|
|
test ah,2
|
|
jz L9BitOffByte7
|
|
test ah,4
|
|
jz L12BitOffByte7
|
|
jmp L20BitOffByte7
|
|
LLen2_3:
|
|
mov ecx,eax
|
|
shr ecx,6
|
|
and ecx,7
|
|
or ecx,8
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,2
|
|
jz LLitDword1
|
|
test al,4
|
|
jz L6BitOffDword1
|
|
test al,8
|
|
jz L9BitOffDword1
|
|
test al,16
|
|
jz L12BitOffDword1
|
|
jmp L20BitOffDword1
|
|
LLen2_4:
|
|
mov ecx,eax
|
|
shr ecx,7
|
|
and ecx,15
|
|
or ecx,16
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,8
|
|
jz LLitDword3
|
|
test al,16
|
|
jz L6BitOffDword3
|
|
test al,32
|
|
jz L9BitOffDword3
|
|
test al,64
|
|
jz L12BitOffDword3
|
|
jmp L20BitOffDword3
|
|
LLen2_5:
|
|
mov ecx,eax
|
|
shr ecx,8
|
|
and ecx,31
|
|
or ecx,32
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,32
|
|
jz LLitDword5
|
|
test al,64
|
|
jz L6BitOffDword5
|
|
test al,128
|
|
jz L9BitOffDword5
|
|
test ah,1
|
|
jz L12BitOffDword5
|
|
jmp L20BitOffDword5
|
|
LLen2_6:
|
|
mov ecx,eax
|
|
shr ecx,9
|
|
and ecx,63
|
|
or ecx,64
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,128
|
|
jz LLitDword7
|
|
test ah,1
|
|
jz L6BitOffDword7
|
|
test ah,2
|
|
jz L9BitOffDword7
|
|
test ah,4
|
|
jz L12BitOffDword7
|
|
jmp L20BitOffDword7
|
|
LLen2_7:
|
|
mov ecx,eax
|
|
shr ecx,10
|
|
and ecx,127
|
|
or ecx,128
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,2
|
|
jz LLitDword1
|
|
test al,4
|
|
jz L6BitOffDword1
|
|
test al,8
|
|
jz L9BitOffDword1
|
|
test al,16
|
|
jz L12BitOffDword1
|
|
jmp L20BitOffDword1
|
|
LLen2_8:
|
|
mov ecx,eax
|
|
shr ecx,11
|
|
and ecx,255
|
|
or ecx,256
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,8
|
|
jz LLitDword3
|
|
test al,16
|
|
jz L6BitOffDword3
|
|
test al,32
|
|
jz L9BitOffDword3
|
|
test al,64
|
|
jz L12BitOffDword3
|
|
jmp L20BitOffDword3
|
|
LLen2_9:
|
|
mov ecx,eax
|
|
shr ecx,12
|
|
and ecx,511
|
|
or ecx,512
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,32
|
|
jz LLitDword5
|
|
test al,64
|
|
jz L6BitOffDword5
|
|
test al,128
|
|
jz L9BitOffDword5
|
|
test ah,1
|
|
jz L12BitOffDword5
|
|
jmp L20BitOffDword5
|
|
LLen2_10:
|
|
mov ecx,eax
|
|
shr ecx,13
|
|
and ecx,1023
|
|
or ecx,1024
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,128
|
|
jz LLitDword7
|
|
test ah,1
|
|
jz L6BitOffDword7
|
|
test ah,2
|
|
jz L9BitOffDword7
|
|
test ah,4
|
|
jz L12BitOffDword7
|
|
jmp L20BitOffDword7
|
|
LLen2_11:
|
|
mov ecx,eax
|
|
shr ecx,14
|
|
and ecx,2047
|
|
or ecx,2048
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,2
|
|
jz LLitDword1
|
|
test al,4
|
|
jz L6BitOffDword1
|
|
test al,8
|
|
jz L9BitOffDword1
|
|
test al,16
|
|
jz L12BitOffDword1
|
|
jmp L20BitOffDword1
|
|
|
|
LLitDword2:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,3
|
|
and edx,31
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
mov eax,ecx
|
|
shr ecx,2
|
|
and eax,3
|
|
rep movsd
|
|
mov ecx,eax
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,5
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock3
|
|
|
|
L6BitOffDword3:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,5
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
cmp esi,4
|
|
jb LCopyByte3
|
|
jmp LCopyDword3
|
|
|
|
L9BitOffDword7:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,10
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword3
|
|
|
|
L12BitOffDword3:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,7
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword3
|
|
|
|
L20BitOffDword3:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,7
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyDword3
|
|
|
|
// Copy Dword 3
|
|
LCopyDword3:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
mov edx,ecx
|
|
shr ecx,2
|
|
and edx,3
|
|
rep movsd
|
|
mov ecx,edx
|
|
rep movsb
|
|
jmp LBlock3
|
|
|
|
LLitSingle2:
|
|
#ifdef SAFETY
|
|
cmp edi,pbLimDst
|
|
jae LFail
|
|
#endif //SAFETY
|
|
mov edx,eax
|
|
shr edx,3
|
|
mov [edi],dl
|
|
inc edi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LBlock3
|
|
|
|
LLitByte2:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,3
|
|
and edx,31
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,5
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock3
|
|
|
|
L6BitOffByte3:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,5
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte3
|
|
|
|
L9BitOffByte7:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,10
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte3
|
|
|
|
L12BitOffByte3:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,7
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte3
|
|
|
|
L20BitOffByte3:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,7
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyByte3
|
|
|
|
// Copy Byte 3
|
|
LCopyByte3:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
rep movsb
|
|
|
|
// Block 3
|
|
LBlock3:
|
|
test al,8
|
|
jz LLen3_0
|
|
test al,16
|
|
jz LLen3_1
|
|
test al,32
|
|
jz LLen3_2
|
|
test al,64
|
|
jz LLen3_3
|
|
test al,128
|
|
jz LLen3_4
|
|
test ah,1
|
|
jz LLen3_5
|
|
test ah,2
|
|
jz LLen3_6
|
|
test ah,4
|
|
jz LLen3_7
|
|
test ah,8
|
|
jz LLen3_8
|
|
test ah,16
|
|
jz LLen3_9
|
|
test ah,32
|
|
jz LLen3_10
|
|
test ah,64
|
|
jz LLen3_11
|
|
jmp LDone
|
|
LLen3_0:
|
|
mov ecx,1
|
|
test al,16
|
|
jz LLitSingle4
|
|
test al,32
|
|
jz L6BitOffByte4
|
|
test al,64
|
|
jz L9BitOffByte4
|
|
test al,128
|
|
jz L12BitOffByte4
|
|
jmp L20BitOffByte4
|
|
LLen3_1:
|
|
mov ecx,eax
|
|
shr ecx,5
|
|
and ecx,1
|
|
or ecx,2
|
|
test al,64
|
|
jz LLitByte6
|
|
test al,128
|
|
jz L6BitOffByte6
|
|
test ah,1
|
|
jz L9BitOffByte6
|
|
test ah,2
|
|
jz L12BitOffByte6
|
|
jmp L20BitOffByte6
|
|
LLen3_2:
|
|
mov ecx,eax
|
|
shr ecx,6
|
|
and ecx,3
|
|
or ecx,4
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,1
|
|
jz LLitByte0
|
|
test al,2
|
|
jz L6BitOffByte0
|
|
test al,4
|
|
jz L9BitOffByte0
|
|
test al,8
|
|
jz L12BitOffByte0
|
|
jmp L20BitOffByte0
|
|
LLen3_3:
|
|
mov ecx,eax
|
|
shr ecx,7
|
|
and ecx,7
|
|
or ecx,8
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,4
|
|
jz LLitDword2
|
|
test al,8
|
|
jz L6BitOffDword2
|
|
test al,16
|
|
jz L9BitOffDword2
|
|
test al,32
|
|
jz L12BitOffDword2
|
|
jmp L20BitOffDword2
|
|
LLen3_4:
|
|
mov ecx,eax
|
|
shr ecx,8
|
|
and ecx,15
|
|
or ecx,16
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,16
|
|
jz LLitDword4
|
|
test al,32
|
|
jz L6BitOffDword4
|
|
test al,64
|
|
jz L9BitOffDword4
|
|
test al,128
|
|
jz L12BitOffDword4
|
|
jmp L20BitOffDword4
|
|
LLen3_5:
|
|
mov ecx,eax
|
|
shr ecx,9
|
|
and ecx,31
|
|
or ecx,32
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,64
|
|
jz LLitDword6
|
|
test al,128
|
|
jz L6BitOffDword6
|
|
test ah,1
|
|
jz L9BitOffDword6
|
|
test ah,2
|
|
jz L12BitOffDword6
|
|
jmp L20BitOffDword6
|
|
LLen3_6:
|
|
mov ecx,eax
|
|
shr ecx,10
|
|
and ecx,63
|
|
or ecx,64
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,1
|
|
jz LLitDword0
|
|
test al,2
|
|
jz L6BitOffDword0
|
|
test al,4
|
|
jz L9BitOffDword0
|
|
test al,8
|
|
jz L12BitOffDword0
|
|
jmp L20BitOffDword0
|
|
LLen3_7:
|
|
mov ecx,eax
|
|
shr ecx,11
|
|
and ecx,127
|
|
or ecx,128
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,4
|
|
jz LLitDword2
|
|
test al,8
|
|
jz L6BitOffDword2
|
|
test al,16
|
|
jz L9BitOffDword2
|
|
test al,32
|
|
jz L12BitOffDword2
|
|
jmp L20BitOffDword2
|
|
LLen3_8:
|
|
mov ecx,eax
|
|
shr ecx,12
|
|
and ecx,255
|
|
or ecx,256
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,16
|
|
jz LLitDword4
|
|
test al,32
|
|
jz L6BitOffDword4
|
|
test al,64
|
|
jz L9BitOffDword4
|
|
test al,128
|
|
jz L12BitOffDword4
|
|
jmp L20BitOffDword4
|
|
LLen3_9:
|
|
mov ecx,eax
|
|
shr ecx,13
|
|
and ecx,511
|
|
or ecx,512
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,64
|
|
jz LLitDword6
|
|
test al,128
|
|
jz L6BitOffDword6
|
|
test ah,1
|
|
jz L9BitOffDword6
|
|
test ah,2
|
|
jz L12BitOffDword6
|
|
jmp L20BitOffDword6
|
|
LLen3_10:
|
|
mov ecx,eax
|
|
shr ecx,14
|
|
and ecx,1023
|
|
or ecx,1024
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,1
|
|
jz LLitDword0
|
|
test al,2
|
|
jz L6BitOffDword0
|
|
test al,4
|
|
jz L9BitOffDword0
|
|
test al,8
|
|
jz L12BitOffDword0
|
|
jmp L20BitOffDword0
|
|
LLen3_11:
|
|
mov ecx,eax
|
|
shr ecx,15
|
|
and ecx,2047
|
|
or ecx,2048
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,4
|
|
jz LLitDword2
|
|
test al,8
|
|
jz L6BitOffDword2
|
|
test al,16
|
|
jz L9BitOffDword2
|
|
test al,32
|
|
jz L12BitOffDword2
|
|
jmp L20BitOffDword2
|
|
|
|
LLitDword3:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,4
|
|
and edx,15
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
mov eax,ecx
|
|
shr ecx,2
|
|
and eax,3
|
|
rep movsd
|
|
mov ecx,eax
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,4
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock4
|
|
|
|
L6BitOffDword4:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,6
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
cmp esi,4
|
|
jb LCopyByte4
|
|
jmp LCopyDword4
|
|
|
|
L9BitOffDword0:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,3
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyDword4
|
|
|
|
L12BitOffDword4:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,8
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword4
|
|
|
|
L20BitOffDword4:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,8
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyDword4
|
|
|
|
// Copy Dword 4
|
|
LCopyDword4:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
mov edx,ecx
|
|
shr ecx,2
|
|
and edx,3
|
|
rep movsd
|
|
mov ecx,edx
|
|
rep movsb
|
|
jmp LBlock4
|
|
|
|
LLitSingle3:
|
|
#ifdef SAFETY
|
|
cmp edi,pbLimDst
|
|
jae LFail
|
|
#endif //SAFETY
|
|
mov edx,eax
|
|
shr edx,4
|
|
mov [edi],dl
|
|
inc edi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LBlock4
|
|
|
|
LLitByte3:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,4
|
|
and edx,15
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,4
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock4
|
|
|
|
L6BitOffByte4:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,6
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte4
|
|
|
|
L9BitOffByte0:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,3
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte4
|
|
|
|
L12BitOffByte4:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,8
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte4
|
|
|
|
L20BitOffByte4:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,8
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyByte4
|
|
|
|
// Copy Byte 4
|
|
LCopyByte4:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
rep movsb
|
|
|
|
// Block 4
|
|
LBlock4:
|
|
test al,16
|
|
jz LLen4_0
|
|
test al,32
|
|
jz LLen4_1
|
|
test al,64
|
|
jz LLen4_2
|
|
test al,128
|
|
jz LLen4_3
|
|
test ah,1
|
|
jz LLen4_4
|
|
test ah,2
|
|
jz LLen4_5
|
|
test ah,4
|
|
jz LLen4_6
|
|
test ah,8
|
|
jz LLen4_7
|
|
test ah,16
|
|
jz LLen4_8
|
|
test ah,32
|
|
jz LLen4_9
|
|
test ah,64
|
|
jz LLen4_10
|
|
test ah,128
|
|
jz LLen4_11
|
|
jmp LDone
|
|
LLen4_0:
|
|
mov ecx,1
|
|
test al,32
|
|
jz LLitSingle5
|
|
test al,64
|
|
jz L6BitOffByte5
|
|
test al,128
|
|
jz L9BitOffByte5
|
|
test ah,1
|
|
jz L12BitOffByte5
|
|
jmp L20BitOffByte5
|
|
LLen4_1:
|
|
mov ecx,eax
|
|
shr ecx,6
|
|
and ecx,1
|
|
or ecx,2
|
|
test al,128
|
|
jz LLitByte7
|
|
test ah,1
|
|
jz L6BitOffByte7
|
|
test ah,2
|
|
jz L9BitOffByte7
|
|
test ah,4
|
|
jz L12BitOffByte7
|
|
jmp L20BitOffByte7
|
|
LLen4_2:
|
|
mov ecx,eax
|
|
shr ecx,7
|
|
and ecx,3
|
|
or ecx,4
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,2
|
|
jz LLitByte1
|
|
test al,4
|
|
jz L6BitOffByte1
|
|
test al,8
|
|
jz L9BitOffByte1
|
|
test al,16
|
|
jz L12BitOffByte1
|
|
jmp L20BitOffByte1
|
|
LLen4_3:
|
|
mov ecx,eax
|
|
shr ecx,8
|
|
and ecx,7
|
|
or ecx,8
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,8
|
|
jz LLitDword3
|
|
test al,16
|
|
jz L6BitOffDword3
|
|
test al,32
|
|
jz L9BitOffDword3
|
|
test al,64
|
|
jz L12BitOffDword3
|
|
jmp L20BitOffDword3
|
|
LLen4_4:
|
|
mov ecx,eax
|
|
shr ecx,9
|
|
and ecx,15
|
|
or ecx,16
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,32
|
|
jz LLitDword5
|
|
test al,64
|
|
jz L6BitOffDword5
|
|
test al,128
|
|
jz L9BitOffDword5
|
|
test ah,1
|
|
jz L12BitOffDword5
|
|
jmp L20BitOffDword5
|
|
LLen4_5:
|
|
mov ecx,eax
|
|
shr ecx,10
|
|
and ecx,31
|
|
or ecx,32
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,128
|
|
jz LLitDword7
|
|
test ah,1
|
|
jz L6BitOffDword7
|
|
test ah,2
|
|
jz L9BitOffDword7
|
|
test ah,4
|
|
jz L12BitOffDword7
|
|
jmp L20BitOffDword7
|
|
LLen4_6:
|
|
mov ecx,eax
|
|
shr ecx,11
|
|
and ecx,63
|
|
or ecx,64
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,2
|
|
jz LLitDword1
|
|
test al,4
|
|
jz L6BitOffDword1
|
|
test al,8
|
|
jz L9BitOffDword1
|
|
test al,16
|
|
jz L12BitOffDword1
|
|
jmp L20BitOffDword1
|
|
LLen4_7:
|
|
mov ecx,eax
|
|
shr ecx,12
|
|
and ecx,127
|
|
or ecx,128
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,8
|
|
jz LLitDword3
|
|
test al,16
|
|
jz L6BitOffDword3
|
|
test al,32
|
|
jz L9BitOffDword3
|
|
test al,64
|
|
jz L12BitOffDword3
|
|
jmp L20BitOffDword3
|
|
LLen4_8:
|
|
mov ecx,eax
|
|
shr ecx,13
|
|
and ecx,255
|
|
or ecx,256
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,32
|
|
jz LLitDword5
|
|
test al,64
|
|
jz L6BitOffDword5
|
|
test al,128
|
|
jz L9BitOffDword5
|
|
test ah,1
|
|
jz L12BitOffDword5
|
|
jmp L20BitOffDword5
|
|
LLen4_9:
|
|
mov ecx,eax
|
|
shr ecx,14
|
|
and ecx,511
|
|
or ecx,512
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,128
|
|
jz LLitDword7
|
|
test ah,1
|
|
jz L6BitOffDword7
|
|
test ah,2
|
|
jz L9BitOffDword7
|
|
test ah,4
|
|
jz L12BitOffDword7
|
|
jmp L20BitOffDword7
|
|
LLen4_10:
|
|
mov ecx,eax
|
|
shr ecx,15
|
|
and ecx,1023
|
|
or ecx,1024
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,2
|
|
jz LLitDword1
|
|
test al,4
|
|
jz L6BitOffDword1
|
|
test al,8
|
|
jz L9BitOffDword1
|
|
test al,16
|
|
jz L12BitOffDword1
|
|
jmp L20BitOffDword1
|
|
LLen4_11:
|
|
mov ecx,eax
|
|
shr ecx,16
|
|
and ecx,2047
|
|
or ecx,2048
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,8
|
|
jz LLitDword3
|
|
test al,16
|
|
jz L6BitOffDword3
|
|
test al,32
|
|
jz L9BitOffDword3
|
|
test al,64
|
|
jz L12BitOffDword3
|
|
jmp L20BitOffDword3
|
|
|
|
LLitDword4:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,5
|
|
and edx,7
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
mov eax,ecx
|
|
shr ecx,2
|
|
and eax,3
|
|
rep movsd
|
|
mov ecx,eax
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,3
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock5
|
|
|
|
L6BitOffDword5:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,7
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
cmp esi,4
|
|
jb LCopyByte5
|
|
jmp LCopyDword5
|
|
|
|
L9BitOffDword1:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,4
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyDword5
|
|
|
|
L12BitOffDword5:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,9
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword5
|
|
|
|
L20BitOffDword5:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,9
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyDword5
|
|
|
|
// Copy Dword 5
|
|
LCopyDword5:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
mov edx,ecx
|
|
shr ecx,2
|
|
and edx,3
|
|
rep movsd
|
|
mov ecx,edx
|
|
rep movsb
|
|
jmp LBlock5
|
|
|
|
LLitSingle4:
|
|
#ifdef SAFETY
|
|
cmp edi,pbLimDst
|
|
jae LFail
|
|
#endif //SAFETY
|
|
mov edx,eax
|
|
shr edx,5
|
|
mov [edi],dl
|
|
inc edi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LBlock5
|
|
|
|
LLitByte4:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,5
|
|
and edx,7
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,3
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock5
|
|
|
|
L6BitOffByte5:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,7
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte5
|
|
|
|
L9BitOffByte1:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,4
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte5
|
|
|
|
L12BitOffByte5:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,9
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte5
|
|
|
|
L20BitOffByte5:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,9
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyByte5
|
|
|
|
// Copy Byte 5
|
|
LCopyByte5:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
rep movsb
|
|
|
|
// Block 5
|
|
LBlock5:
|
|
test al,32
|
|
jz LLen5_0
|
|
test al,64
|
|
jz LLen5_1
|
|
test al,128
|
|
jz LLen5_2
|
|
test ah,1
|
|
jz LLen5_3
|
|
test ah,2
|
|
jz LLen5_4
|
|
test ah,4
|
|
jz LLen5_5
|
|
test ah,8
|
|
jz LLen5_6
|
|
test ah,16
|
|
jz LLen5_7
|
|
test ah,32
|
|
jz LLen5_8
|
|
test ah,64
|
|
jz LLen5_9
|
|
test ah,128
|
|
jz LLen5_10
|
|
test eax,65536
|
|
jz LLen5_11
|
|
jmp LDone
|
|
LLen5_0:
|
|
mov ecx,1
|
|
test al,64
|
|
jz LLitSingle6
|
|
test al,128
|
|
jz L6BitOffByte6
|
|
test ah,1
|
|
jz L9BitOffByte6
|
|
test ah,2
|
|
jz L12BitOffByte6
|
|
jmp L20BitOffByte6
|
|
LLen5_1:
|
|
mov ecx,eax
|
|
shr ecx,7
|
|
and ecx,1
|
|
or ecx,2
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,1
|
|
jz LLitByte0
|
|
test al,2
|
|
jz L6BitOffByte0
|
|
test al,4
|
|
jz L9BitOffByte0
|
|
test al,8
|
|
jz L12BitOffByte0
|
|
jmp L20BitOffByte0
|
|
LLen5_2:
|
|
mov ecx,eax
|
|
shr ecx,8
|
|
and ecx,3
|
|
or ecx,4
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,4
|
|
jz LLitByte2
|
|
test al,8
|
|
jz L6BitOffByte2
|
|
test al,16
|
|
jz L9BitOffByte2
|
|
test al,32
|
|
jz L12BitOffByte2
|
|
jmp L20BitOffByte2
|
|
LLen5_3:
|
|
mov ecx,eax
|
|
shr ecx,9
|
|
and ecx,7
|
|
or ecx,8
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,16
|
|
jz LLitDword4
|
|
test al,32
|
|
jz L6BitOffDword4
|
|
test al,64
|
|
jz L9BitOffDword4
|
|
test al,128
|
|
jz L12BitOffDword4
|
|
jmp L20BitOffDword4
|
|
LLen5_4:
|
|
mov ecx,eax
|
|
shr ecx,10
|
|
and ecx,15
|
|
or ecx,16
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,64
|
|
jz LLitDword6
|
|
test al,128
|
|
jz L6BitOffDword6
|
|
test ah,1
|
|
jz L9BitOffDword6
|
|
test ah,2
|
|
jz L12BitOffDword6
|
|
jmp L20BitOffDword6
|
|
LLen5_5:
|
|
mov ecx,eax
|
|
shr ecx,11
|
|
and ecx,31
|
|
or ecx,32
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,1
|
|
jz LLitDword0
|
|
test al,2
|
|
jz L6BitOffDword0
|
|
test al,4
|
|
jz L9BitOffDword0
|
|
test al,8
|
|
jz L12BitOffDword0
|
|
jmp L20BitOffDword0
|
|
LLen5_6:
|
|
mov ecx,eax
|
|
shr ecx,12
|
|
and ecx,63
|
|
or ecx,64
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,4
|
|
jz LLitDword2
|
|
test al,8
|
|
jz L6BitOffDword2
|
|
test al,16
|
|
jz L9BitOffDword2
|
|
test al,32
|
|
jz L12BitOffDword2
|
|
jmp L20BitOffDword2
|
|
LLen5_7:
|
|
mov ecx,eax
|
|
shr ecx,13
|
|
and ecx,127
|
|
or ecx,128
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,16
|
|
jz LLitDword4
|
|
test al,32
|
|
jz L6BitOffDword4
|
|
test al,64
|
|
jz L9BitOffDword4
|
|
test al,128
|
|
jz L12BitOffDword4
|
|
jmp L20BitOffDword4
|
|
LLen5_8:
|
|
mov ecx,eax
|
|
shr ecx,14
|
|
and ecx,255
|
|
or ecx,256
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,64
|
|
jz LLitDword6
|
|
test al,128
|
|
jz L6BitOffDword6
|
|
test ah,1
|
|
jz L9BitOffDword6
|
|
test ah,2
|
|
jz L12BitOffDword6
|
|
jmp L20BitOffDword6
|
|
LLen5_9:
|
|
mov ecx,eax
|
|
shr ecx,15
|
|
and ecx,511
|
|
or ecx,512
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,1
|
|
jz LLitDword0
|
|
test al,2
|
|
jz L6BitOffDword0
|
|
test al,4
|
|
jz L9BitOffDword0
|
|
test al,8
|
|
jz L12BitOffDword0
|
|
jmp L20BitOffDword0
|
|
LLen5_10:
|
|
mov ecx,eax
|
|
shr ecx,16
|
|
and ecx,1023
|
|
or ecx,1024
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,4
|
|
jz LLitDword2
|
|
test al,8
|
|
jz L6BitOffDword2
|
|
test al,16
|
|
jz L9BitOffDword2
|
|
test al,32
|
|
jz L12BitOffDword2
|
|
jmp L20BitOffDword2
|
|
LLen5_11:
|
|
mov ecx,eax
|
|
shr ecx,17
|
|
and ecx,2047
|
|
or ecx,2048
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,16
|
|
jz LLitDword4
|
|
test al,32
|
|
jz L6BitOffDword4
|
|
test al,64
|
|
jz L9BitOffDword4
|
|
test al,128
|
|
jz L12BitOffDword4
|
|
jmp L20BitOffDword4
|
|
|
|
LLitDword5:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,6
|
|
and edx,3
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
mov eax,ecx
|
|
shr ecx,2
|
|
and eax,3
|
|
rep movsd
|
|
mov ecx,eax
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,2
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock6
|
|
|
|
L6BitOffDword6:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,8
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
cmp esi,4
|
|
jb LCopyByte6
|
|
jmp LCopyDword6
|
|
|
|
L9BitOffDword2:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,5
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyDword6
|
|
|
|
L12BitOffDword6:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,10
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword6
|
|
|
|
L20BitOffDword6:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,10
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyDword6
|
|
|
|
// Copy Dword 6
|
|
LCopyDword6:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
mov edx,ecx
|
|
shr ecx,2
|
|
and edx,3
|
|
rep movsd
|
|
mov ecx,edx
|
|
rep movsb
|
|
jmp LBlock6
|
|
|
|
LLitSingle5:
|
|
#ifdef SAFETY
|
|
cmp edi,pbLimDst
|
|
jae LFail
|
|
#endif //SAFETY
|
|
mov edx,eax
|
|
shr edx,6
|
|
mov [edi],dl
|
|
inc edi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LBlock6
|
|
|
|
LLitByte5:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,6
|
|
and edx,3
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,2
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock6
|
|
|
|
L6BitOffByte6:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,8
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte6
|
|
|
|
L9BitOffByte2:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,5
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte6
|
|
|
|
L12BitOffByte6:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,10
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte6
|
|
|
|
L20BitOffByte6:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,10
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyByte6
|
|
|
|
// Copy Byte 6
|
|
LCopyByte6:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
rep movsb
|
|
|
|
// Block 6
|
|
LBlock6:
|
|
test al,64
|
|
jz LLen6_0
|
|
test al,128
|
|
jz LLen6_1
|
|
test ah,1
|
|
jz LLen6_2
|
|
test ah,2
|
|
jz LLen6_3
|
|
test ah,4
|
|
jz LLen6_4
|
|
test ah,8
|
|
jz LLen6_5
|
|
test ah,16
|
|
jz LLen6_6
|
|
test ah,32
|
|
jz LLen6_7
|
|
test ah,64
|
|
jz LLen6_8
|
|
test ah,128
|
|
jz LLen6_9
|
|
test eax,65536
|
|
jz LLen6_10
|
|
test eax,131072
|
|
jz LLen6_11
|
|
jmp LDone
|
|
LLen6_0:
|
|
mov ecx,1
|
|
test al,128
|
|
jz LLitSingle7
|
|
test ah,1
|
|
jz L6BitOffByte7
|
|
test ah,2
|
|
jz L9BitOffByte7
|
|
test ah,4
|
|
jz L12BitOffByte7
|
|
jmp L20BitOffByte7
|
|
LLen6_1:
|
|
mov ecx,eax
|
|
shr ecx,8
|
|
and ecx,1
|
|
or ecx,2
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,2
|
|
jz LLitByte1
|
|
test al,4
|
|
jz L6BitOffByte1
|
|
test al,8
|
|
jz L9BitOffByte1
|
|
test al,16
|
|
jz L12BitOffByte1
|
|
jmp L20BitOffByte1
|
|
LLen6_2:
|
|
mov ecx,eax
|
|
shr ecx,9
|
|
and ecx,3
|
|
or ecx,4
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,8
|
|
jz LLitByte3
|
|
test al,16
|
|
jz L6BitOffByte3
|
|
test al,32
|
|
jz L9BitOffByte3
|
|
test al,64
|
|
jz L12BitOffByte3
|
|
jmp L20BitOffByte3
|
|
LLen6_3:
|
|
mov ecx,eax
|
|
shr ecx,10
|
|
and ecx,7
|
|
or ecx,8
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,32
|
|
jz LLitDword5
|
|
test al,64
|
|
jz L6BitOffDword5
|
|
test al,128
|
|
jz L9BitOffDword5
|
|
test ah,1
|
|
jz L12BitOffDword5
|
|
jmp L20BitOffDword5
|
|
LLen6_4:
|
|
mov ecx,eax
|
|
shr ecx,11
|
|
and ecx,15
|
|
or ecx,16
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,128
|
|
jz LLitDword7
|
|
test ah,1
|
|
jz L6BitOffDword7
|
|
test ah,2
|
|
jz L9BitOffDword7
|
|
test ah,4
|
|
jz L12BitOffDword7
|
|
jmp L20BitOffDword7
|
|
LLen6_5:
|
|
mov ecx,eax
|
|
shr ecx,12
|
|
and ecx,31
|
|
or ecx,32
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,2
|
|
jz LLitDword1
|
|
test al,4
|
|
jz L6BitOffDword1
|
|
test al,8
|
|
jz L9BitOffDword1
|
|
test al,16
|
|
jz L12BitOffDword1
|
|
jmp L20BitOffDword1
|
|
LLen6_6:
|
|
mov ecx,eax
|
|
shr ecx,13
|
|
and ecx,63
|
|
or ecx,64
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,8
|
|
jz LLitDword3
|
|
test al,16
|
|
jz L6BitOffDword3
|
|
test al,32
|
|
jz L9BitOffDword3
|
|
test al,64
|
|
jz L12BitOffDword3
|
|
jmp L20BitOffDword3
|
|
LLen6_7:
|
|
mov ecx,eax
|
|
shr ecx,14
|
|
and ecx,127
|
|
or ecx,128
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,32
|
|
jz LLitDword5
|
|
test al,64
|
|
jz L6BitOffDword5
|
|
test al,128
|
|
jz L9BitOffDword5
|
|
test ah,1
|
|
jz L12BitOffDword5
|
|
jmp L20BitOffDword5
|
|
LLen6_8:
|
|
mov ecx,eax
|
|
shr ecx,15
|
|
and ecx,255
|
|
or ecx,256
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,128
|
|
jz LLitDword7
|
|
test ah,1
|
|
jz L6BitOffDword7
|
|
test ah,2
|
|
jz L9BitOffDword7
|
|
test ah,4
|
|
jz L12BitOffDword7
|
|
jmp L20BitOffDword7
|
|
LLen6_9:
|
|
mov ecx,eax
|
|
shr ecx,16
|
|
and ecx,511
|
|
or ecx,512
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,2
|
|
jz LLitDword1
|
|
test al,4
|
|
jz L6BitOffDword1
|
|
test al,8
|
|
jz L9BitOffDword1
|
|
test al,16
|
|
jz L12BitOffDword1
|
|
jmp L20BitOffDword1
|
|
LLen6_10:
|
|
mov ecx,eax
|
|
shr ecx,17
|
|
and ecx,1023
|
|
or ecx,1024
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,8
|
|
jz LLitDword3
|
|
test al,16
|
|
jz L6BitOffDword3
|
|
test al,32
|
|
jz L9BitOffDword3
|
|
test al,64
|
|
jz L12BitOffDword3
|
|
jmp L20BitOffDword3
|
|
LLen6_11:
|
|
mov ecx,eax
|
|
shr ecx,18
|
|
and ecx,2047
|
|
or ecx,2048
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,32
|
|
jz LLitDword5
|
|
test al,64
|
|
jz L6BitOffDword5
|
|
test al,128
|
|
jz L9BitOffDword5
|
|
test ah,1
|
|
jz L12BitOffDword5
|
|
jmp L20BitOffDword5
|
|
|
|
LLitDword6:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,7
|
|
and edx,1
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
mov eax,ecx
|
|
shr ecx,2
|
|
and eax,3
|
|
rep movsd
|
|
mov ecx,eax
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,1
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock7
|
|
|
|
L6BitOffDword7:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,9
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
cmp esi,4
|
|
jb LCopyByte7
|
|
jmp LCopyDword7
|
|
|
|
L9BitOffDword3:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,6
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyDword7
|
|
|
|
L12BitOffDword7:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,11
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyDword7
|
|
|
|
L20BitOffDword7:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,11
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyDword7
|
|
|
|
// Copy Dword 7
|
|
LCopyDword7:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
mov edx,ecx
|
|
shr ecx,2
|
|
and edx,3
|
|
rep movsd
|
|
mov ecx,edx
|
|
rep movsb
|
|
jmp LBlock7
|
|
|
|
LLitSingle6:
|
|
#ifdef SAFETY
|
|
cmp edi,pbLimDst
|
|
jae LFail
|
|
#endif //SAFETY
|
|
mov edx,eax
|
|
shr edx,7
|
|
mov [edi],dl
|
|
inc edi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LBlock7
|
|
|
|
LLitByte6:
|
|
#ifdef SAFETY
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
ja LFail
|
|
#endif //SAFETY
|
|
dec ecx
|
|
mov edx,eax
|
|
shr edx,7
|
|
and edx,1
|
|
#ifdef SAFETY
|
|
lea esi,[ebx-3+ecx]
|
|
cmp esi,pbLimSrc
|
|
ja LFail
|
|
sub esi,ecx
|
|
#else //!SAFETY
|
|
lea esi,[ebx-3]
|
|
#endif //!SAFETY
|
|
rep movsb
|
|
lea ebx,[esi+4]
|
|
mov eax,[esi]
|
|
mov esi,eax
|
|
shl esi,1
|
|
or edx,esi
|
|
mov [edi],dl
|
|
inc edi
|
|
jmp LBlock7
|
|
|
|
L6BitOffByte7:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,9
|
|
and esi,63
|
|
inc esi
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte7
|
|
|
|
L9BitOffByte3:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,6
|
|
and esi,511
|
|
add esi,65
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
jmp LCopyByte7
|
|
|
|
L12BitOffByte7:
|
|
mov esi,eax
|
|
inc ecx
|
|
shr esi,11
|
|
and esi,4095
|
|
add esi,577
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
jmp LCopyByte7
|
|
|
|
L20BitOffByte7:
|
|
mov esi,eax
|
|
add ecx,2
|
|
shr esi,11
|
|
and esi,1048575
|
|
add esi,4673
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
jmp LCopyByte7
|
|
|
|
// Copy Byte 7
|
|
LCopyByte7:
|
|
#ifdef SAFETY
|
|
push edx
|
|
lea edx,[edi+ecx]
|
|
cmp edx,pbLimDst
|
|
pop edx
|
|
ja LFail
|
|
#endif //SAFETY
|
|
neg esi
|
|
add esi,edi
|
|
#ifdef SAFETY
|
|
cmp esi,pvDst
|
|
jb LFail
|
|
#endif //SAFETY
|
|
rep movsb
|
|
|
|
// Block 7
|
|
LBlock7:
|
|
test al,128
|
|
jz LLen7_0
|
|
test ah,1
|
|
jz LLen7_1
|
|
test ah,2
|
|
jz LLen7_2
|
|
test ah,4
|
|
jz LLen7_3
|
|
test ah,8
|
|
jz LLen7_4
|
|
test ah,16
|
|
jz LLen7_5
|
|
test ah,32
|
|
jz LLen7_6
|
|
test ah,64
|
|
jz LLen7_7
|
|
test ah,128
|
|
jz LLen7_8
|
|
test eax,65536
|
|
jz LLen7_9
|
|
test eax,131072
|
|
jz LLen7_10
|
|
test eax,262144
|
|
jz LLen7_11
|
|
jmp LDone
|
|
LLen7_0:
|
|
mov ecx,1
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,1
|
|
jz LLitSingle0
|
|
test al,2
|
|
jz L6BitOffByte0
|
|
test al,4
|
|
jz L9BitOffByte0
|
|
test al,8
|
|
jz L12BitOffByte0
|
|
jmp L20BitOffByte0
|
|
LLen7_1:
|
|
mov ecx,eax
|
|
shr ecx,9
|
|
and ecx,1
|
|
or ecx,2
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,4
|
|
jz LLitByte2
|
|
test al,8
|
|
jz L6BitOffByte2
|
|
test al,16
|
|
jz L9BitOffByte2
|
|
test al,32
|
|
jz L12BitOffByte2
|
|
jmp L20BitOffByte2
|
|
LLen7_2:
|
|
mov ecx,eax
|
|
shr ecx,10
|
|
and ecx,3
|
|
or ecx,4
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,16
|
|
jz LLitByte4
|
|
test al,32
|
|
jz L6BitOffByte4
|
|
test al,64
|
|
jz L9BitOffByte4
|
|
test al,128
|
|
jz L12BitOffByte4
|
|
jmp L20BitOffByte4
|
|
LLen7_3:
|
|
mov ecx,eax
|
|
shr ecx,11
|
|
and ecx,7
|
|
or ecx,8
|
|
mov eax,[ebx-3]
|
|
inc ebx
|
|
test al,64
|
|
jz LLitDword6
|
|
test al,128
|
|
jz L6BitOffDword6
|
|
test ah,1
|
|
jz L9BitOffDword6
|
|
test ah,2
|
|
jz L12BitOffDword6
|
|
jmp L20BitOffDword6
|
|
LLen7_4:
|
|
mov ecx,eax
|
|
shr ecx,12
|
|
and ecx,15
|
|
or ecx,16
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,1
|
|
jz LLitDword0
|
|
test al,2
|
|
jz L6BitOffDword0
|
|
test al,4
|
|
jz L9BitOffDword0
|
|
test al,8
|
|
jz L12BitOffDword0
|
|
jmp L20BitOffDword0
|
|
LLen7_5:
|
|
mov ecx,eax
|
|
shr ecx,13
|
|
and ecx,31
|
|
or ecx,32
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,4
|
|
jz LLitDword2
|
|
test al,8
|
|
jz L6BitOffDword2
|
|
test al,16
|
|
jz L9BitOffDword2
|
|
test al,32
|
|
jz L12BitOffDword2
|
|
jmp L20BitOffDword2
|
|
LLen7_6:
|
|
mov ecx,eax
|
|
shr ecx,14
|
|
and ecx,63
|
|
or ecx,64
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,16
|
|
jz LLitDword4
|
|
test al,32
|
|
jz L6BitOffDword4
|
|
test al,64
|
|
jz L9BitOffDword4
|
|
test al,128
|
|
jz L12BitOffDword4
|
|
jmp L20BitOffDword4
|
|
LLen7_7:
|
|
mov ecx,eax
|
|
shr ecx,15
|
|
and ecx,127
|
|
or ecx,128
|
|
mov eax,[ebx-2]
|
|
add ebx,2
|
|
test al,64
|
|
jz LLitDword6
|
|
test al,128
|
|
jz L6BitOffDword6
|
|
test ah,1
|
|
jz L9BitOffDword6
|
|
test ah,2
|
|
jz L12BitOffDword6
|
|
jmp L20BitOffDword6
|
|
LLen7_8:
|
|
mov ecx,eax
|
|
shr ecx,16
|
|
and ecx,255
|
|
or ecx,256
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,1
|
|
jz LLitDword0
|
|
test al,2
|
|
jz L6BitOffDword0
|
|
test al,4
|
|
jz L9BitOffDword0
|
|
test al,8
|
|
jz L12BitOffDword0
|
|
jmp L20BitOffDword0
|
|
LLen7_9:
|
|
mov ecx,eax
|
|
shr ecx,17
|
|
and ecx,511
|
|
or ecx,512
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,4
|
|
jz LLitDword2
|
|
test al,8
|
|
jz L6BitOffDword2
|
|
test al,16
|
|
jz L9BitOffDword2
|
|
test al,32
|
|
jz L12BitOffDword2
|
|
jmp L20BitOffDword2
|
|
LLen7_10:
|
|
mov ecx,eax
|
|
shr ecx,18
|
|
and ecx,1023
|
|
or ecx,1024
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,16
|
|
jz LLitDword4
|
|
test al,32
|
|
jz L6BitOffDword4
|
|
test al,64
|
|
jz L9BitOffDword4
|
|
test al,128
|
|
jz L12BitOffDword4
|
|
jmp L20BitOffDword4
|
|
LLen7_11:
|
|
mov ecx,eax
|
|
shr ecx,19
|
|
and ecx,2047
|
|
or ecx,2048
|
|
mov eax,[ebx-1]
|
|
add ebx,3
|
|
test al,64
|
|
jz LLitDword6
|
|
test al,128
|
|
jz L6BitOffDword6
|
|
test ah,1
|
|
jz L9BitOffDword6
|
|
test ah,2
|
|
jz L12BitOffDword6
|
|
jmp L20BitOffDword6
|
|
|
|
LDone:
|
|
sub edi,pvDst
|
|
mov cbTot,edi
|
|
}
|
|
|