;
; 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