; ; This file makes heavy use of macros to define a bunch of almost-identical ; functions -- see huffyuv_a.h. ; .586 .mmx .model flat ; alignment has to be 'page' so that I can use 'align 32' below _TEXT64 segment page public use32 'CODE' EXTERN C encode1_shift:BYTE EXTERN C encode1_add_shifted:DWORD EXTERN C encode2_shift:BYTE EXTERN C encode2_add_shifted:DWORD EXTERN C encode3_shift:BYTE EXTERN C encode3_add_shifted:DWORD EXTERN C decode1:DWORD EXTERN C decode1_shift:BYTE EXTERN C decode2:DWORD EXTERN C decode2_shift:BYTE EXTERN C decode3:DWORD EXTERN C decode3_shift:BYTE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HUFF_CODEC_PROC_START MACRO push ebp push edi push esi push ebx mov esi,[esp+4+16] mov edi,[esp+8+16] mov ebp,[esp+12+16] mov eax,[esi] ENDM ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; HUFF_COMPRESS MACRO channel,index,back1,back2,increment back = back1 or back2 IF back mov cl,[esi+&index+&increment] ELSE movzx ebx,byte ptr [esi+&index+&increment] ENDIF ; xor ebx,ebx IF &back1 sub cl,[esi+&index+&increment-&back1] ENDIF IF &back2 sub cl,[esi+&index+&increment-&back2] IF &back1 add cl,[esi+&index+&increment-&back1-&back2] ENDIF ENDIF IF &increment add esi,INCREMENT ENDIF ; mov bl,cl IF back movzx ebx,cl ENDIF mov cl,&channel&_shift[ebx] mov eax,&channel&_add_shifted[ebx*4] add ch,cl jl nostore_&index& sub cl,ch sub ch,32 shld edx,eax,cl