1182 lines
26 KiB
NASM
1182 lines
26 KiB
NASM
|
;405 412 586
|
|||
|
;
|
|||
|
;
|
|||
|
bufer_size=1024*16+2
|
|||
|
fichero=4
|
|||
|
mcu_ptr=8
|
|||
|
color_ptr=12
|
|||
|
estado=16
|
|||
|
color_c=17
|
|||
|
nbits=color_c
|
|||
|
idct=20
|
|||
|
tmp_bits=24
|
|||
|
actable=28
|
|||
|
matriz_limit=32
|
|||
|
sourcebits=36
|
|||
|
sourcebits_index=40
|
|||
|
sourcebits_limit=44
|
|||
|
qt_ptrs=48
|
|||
|
ht_dc_ptrs=64
|
|||
|
ht_ac_ptrs=80
|
|||
|
matrices=96
|
|||
|
tmp_bufer=100
|
|||
|
x_org=104
|
|||
|
y_org=108
|
|||
|
x_mcu=112
|
|||
|
y_mcu=116
|
|||
|
x_size=120
|
|||
|
y_size=124
|
|||
|
x_org2=128
|
|||
|
y_org2=132
|
|||
|
x_mcu2=136
|
|||
|
y_mcu2=140
|
|||
|
x_size2=144
|
|||
|
y_size2=148
|
|||
|
q_ptr=152
|
|||
|
dc=164
|
|||
|
position=204
|
|||
|
draw_ptr=208
|
|||
|
struct_size=212
|
|||
|
|
|||
|
jpeg_info: ;fichero en eax
|
|||
|
;retorna ebp
|
|||
|
xor ebp,ebp
|
|||
|
pushad
|
|||
|
mov ebp,esp
|
|||
|
mov ecx,6
|
|||
|
sub esp,ecx
|
|||
|
mov edi,esp
|
|||
|
call read
|
|||
|
pop dx
|
|||
|
cmp dx,0d8ffh
|
|||
|
je .l1
|
|||
|
mov esp,ebp
|
|||
|
popad
|
|||
|
ret
|
|||
|
.l1: push eax
|
|||
|
mov ecx,struct_size
|
|||
|
call mallocz
|
|||
|
mov [edi],ebp
|
|||
|
mov ebp,edi
|
|||
|
pop dword [ebp+fichero]
|
|||
|
pop ax
|
|||
|
pop cx
|
|||
|
jmp .l3
|
|||
|
.l2: mov ebx,[ebp+tmp_bufer]
|
|||
|
add ebx,[ebx-4]
|
|||
|
mov cx,[ebx-2]
|
|||
|
mov ax,[ebx-4]
|
|||
|
.l3: push .l2
|
|||
|
xchg cl,ch
|
|||
|
add cx,2
|
|||
|
cmp ch,3
|
|||
|
jnc .l4
|
|||
|
cmp al,0ffh
|
|||
|
jne eoi
|
|||
|
cmp ah,0dbh
|
|||
|
je dqt
|
|||
|
cmp ah,0c4h
|
|||
|
je dht
|
|||
|
cmp ah,0c0h
|
|||
|
je sof0
|
|||
|
cmp ah,0dah
|
|||
|
je sos
|
|||
|
cmp ah,0c2h
|
|||
|
je eoi
|
|||
|
cmp ah,0c9h
|
|||
|
je eoi
|
|||
|
cmp ah,0d9h
|
|||
|
je eoi
|
|||
|
.l4: lea edx,[ecx-4]
|
|||
|
xor ecx,ecx
|
|||
|
mov eax,[ebp+fichero]
|
|||
|
call skip
|
|||
|
mov ecx,4
|
|||
|
call READ
|
|||
|
cmp ecx,[edi-4]
|
|||
|
jne eoi
|
|||
|
ret
|
|||
|
|
|||
|
eoi:
|
|||
|
mov esp,[ebp]
|
|||
|
; do not close file - this will be done by caller
|
|||
|
and dword [ebp+fichero], 0
|
|||
|
call jpeg_close
|
|||
|
popad
|
|||
|
xor ebp,ebp
|
|||
|
ret
|
|||
|
|
|||
|
jpeg_close:
|
|||
|
test ebp,ebp
|
|||
|
jz .l2
|
|||
|
pushad
|
|||
|
mov eax,[ebp+fichero]
|
|||
|
call close
|
|||
|
mov edi,[ebp+sourcebits]
|
|||
|
call free
|
|||
|
lea esi,[ebp+qt_ptrs]
|
|||
|
mov ecx,14
|
|||
|
.l1: mov edi,[esi]
|
|||
|
add esi,4
|
|||
|
call free
|
|||
|
loop .l1
|
|||
|
mov edi,ebp
|
|||
|
call free
|
|||
|
popad
|
|||
|
.l2: ret
|
|||
|
|
|||
|
dqt: call READ
|
|||
|
mov esi,edi
|
|||
|
lea eax,[edi+ecx]
|
|||
|
push eax
|
|||
|
.l1: xor eax,eax
|
|||
|
lodsb
|
|||
|
cmp al,4
|
|||
|
jnc eoi
|
|||
|
lea ebx,[ebp+qt_ptrs+eax*4]
|
|||
|
test dword [ebx],-1
|
|||
|
jnz eoi
|
|||
|
mov ecx,64
|
|||
|
xor eax,eax
|
|||
|
sub esp,128
|
|||
|
mov edi,esp
|
|||
|
.l2: lodsb
|
|||
|
stosw
|
|||
|
loop .l2
|
|||
|
mov ecx,256
|
|||
|
call malloc
|
|||
|
mov [ebx],edi
|
|||
|
mov eax,esi
|
|||
|
mov esi,esp
|
|||
|
pushad
|
|||
|
mov ebp,zigzag
|
|||
|
fninit
|
|||
|
mov cl,64
|
|||
|
xor eax,eax
|
|||
|
.l3: fild word[esi]
|
|||
|
mov al,[ebp]
|
|||
|
and al,-2
|
|||
|
add ebp,2
|
|||
|
add esi,2
|
|||
|
mov ebx,eax
|
|||
|
and ebx,28
|
|||
|
fmul dword [ebx+k2]
|
|||
|
mov ebx,eax
|
|||
|
shr ebx,3
|
|||
|
and ebx,4+8+16
|
|||
|
fmul dword [ebx+k2]
|
|||
|
fstp dword [edi+eax]
|
|||
|
dec cl
|
|||
|
jnz .l3
|
|||
|
popad
|
|||
|
mov esi,eax
|
|||
|
add esp,128
|
|||
|
mov eax,[esp]
|
|||
|
sub eax,esi
|
|||
|
jc eoi
|
|||
|
cmp eax,4
|
|||
|
ja .l1
|
|||
|
jne eoi
|
|||
|
pop eax
|
|||
|
ret
|
|||
|
|
|||
|
sof0: call READ
|
|||
|
cmp byte [edi],8
|
|||
|
jne eoi ;precision
|
|||
|
mov ax,[edi+1]
|
|||
|
xchg al,ah
|
|||
|
mov [ebp+y_size],ax
|
|||
|
mov ax,[edi+3]
|
|||
|
xchg al,ah
|
|||
|
mov [ebp+x_size],ax
|
|||
|
mov al,[edi+5] ;ncomponentes
|
|||
|
mov cl,al
|
|||
|
mov [ebp+color_c],al
|
|||
|
mov edx,modes
|
|||
|
dec al
|
|||
|
jz .l1
|
|||
|
dec al
|
|||
|
dec al
|
|||
|
jnz eoi
|
|||
|
mov al,[edi+10]
|
|||
|
mov ah,[edi+13]
|
|||
|
cmp ax,1111h
|
|||
|
jne eoi
|
|||
|
mov al,[edi+7]
|
|||
|
add edx,16
|
|||
|
cmp al,11h
|
|||
|
je .l1
|
|||
|
add edx,16
|
|||
|
cmp al,21h
|
|||
|
je .l1
|
|||
|
add edx,16
|
|||
|
cmp al,22h
|
|||
|
jne eoi
|
|||
|
.l1: lea ebx,[ebp+q_ptr]
|
|||
|
lea esi,[ebp+qt_ptrs]
|
|||
|
mov [ebp+mcu_ptr],edx
|
|||
|
.l2: movzx eax,byte [edi+8]
|
|||
|
add edi,3
|
|||
|
cmp al,4
|
|||
|
jnc eoi
|
|||
|
lea eax,[eax*4+esi]
|
|||
|
mov [ebx],eax
|
|||
|
add ebx,16
|
|||
|
dec cl
|
|||
|
jnz .l2
|
|||
|
ret
|
|||
|
|
|||
|
READ: mov eax,[ebp+fichero]
|
|||
|
mov edi,[ebp+tmp_bufer]
|
|||
|
movzx ecx,cx
|
|||
|
call mresize
|
|||
|
mov [ebp+tmp_bufer],edi
|
|||
|
jmp read
|
|||
|
|
|||
|
dht: call READ
|
|||
|
mov esi,edi
|
|||
|
lea eax,[edi+ecx]
|
|||
|
push eax
|
|||
|
.l1: lodsb
|
|||
|
mov edi,esi
|
|||
|
mov ebx,3+16
|
|||
|
and bl,al
|
|||
|
cmp bl,al
|
|||
|
jne eoi
|
|||
|
shr bl,2
|
|||
|
and al,3
|
|||
|
or bl,al
|
|||
|
lea ebx,[ebp+ht_dc_ptrs+ebx*4]
|
|||
|
test dword [ebx],-1
|
|||
|
jnz eoi
|
|||
|
mov cl,15
|
|||
|
mov al,[edi]
|
|||
|
.l2: inc edi ;calcular numero de codigos
|
|||
|
add al,[edi]
|
|||
|
jc eoi
|
|||
|
dec cl
|
|||
|
jnz .l2
|
|||
|
movzx ecx,al
|
|||
|
lea ecx,[ecx*4+2]
|
|||
|
call malloc
|
|||
|
mov [ebx],edi
|
|||
|
call arbol_hf
|
|||
|
mov eax,[esp]
|
|||
|
sub eax,ebx
|
|||
|
jc eoi
|
|||
|
mov esi,ebx
|
|||
|
cmp eax,4
|
|||
|
ja .l1
|
|||
|
jne eoi
|
|||
|
pop eax
|
|||
|
ret
|
|||
|
|
|||
|
arbol_hf: ;esi=ht edi=memoria para el arbol
|
|||
|
;retorna en ebx el final de ht
|
|||
|
;codigos: bits 0-3=nbits del siguiente numero
|
|||
|
; bits 4-7=numero de zeros
|
|||
|
; bits 8-14=longitud de este codigo o error si =127
|
|||
|
; bit 15=codigo/puntero
|
|||
|
push ebp
|
|||
|
lea ebx,[edi-2]
|
|||
|
add ebx,[ebx-2]
|
|||
|
mov word [ebx],-1 ;codigo de error si encontrado
|
|||
|
push ebx
|
|||
|
push esi
|
|||
|
lea ebx,[esi+16]
|
|||
|
mov ebp,esp
|
|||
|
xor ecx,ecx
|
|||
|
push edi
|
|||
|
push ecx
|
|||
|
add edi,2
|
|||
|
mov dx,1
|
|||
|
add dh,[esi]
|
|||
|
jz .l3
|
|||
|
jmp .l2
|
|||
|
.l1: push edi
|
|||
|
push ecx
|
|||
|
add edi,2
|
|||
|
.l2: inc cl
|
|||
|
cmp cl,dl
|
|||
|
jc .l1
|
|||
|
mov al,[ebx]
|
|||
|
inc ebx
|
|||
|
mov ah,128 ;marca de codigo
|
|||
|
or ah,dl
|
|||
|
cmp edi,[ebp+4]
|
|||
|
jnc .l5
|
|||
|
stosw
|
|||
|
cmp esp,ebp
|
|||
|
jnc .l5
|
|||
|
pop ecx
|
|||
|
pop esi
|
|||
|
lea eax,[edi-2]
|
|||
|
sub eax,esi
|
|||
|
mov [esi],ax
|
|||
|
dec dh
|
|||
|
jnz .l2 ;ncodigos
|
|||
|
mov esi,[ebp]
|
|||
|
.l3: inc esi
|
|||
|
inc dl
|
|||
|
cmp dl,17
|
|||
|
jnc .l4
|
|||
|
add dh,[esi]
|
|||
|
jz .l3
|
|||
|
mov [ebp],esi
|
|||
|
jmp .l2
|
|||
|
.l4: lea esp,[ebp+8]
|
|||
|
pop ebp
|
|||
|
ret
|
|||
|
.l5: mov ebp,[ebp+8]
|
|||
|
jmp eoi
|
|||
|
|
|||
|
sos: sub ecx,4 ;a continuacion vienen los datos de la imagen
|
|||
|
call READ
|
|||
|
mov eax,[ebp+fichero]
|
|||
|
call ftell
|
|||
|
mov [ebp+position],edx
|
|||
|
mov esi,edi
|
|||
|
lea edi,[ebp+q_ptr]
|
|||
|
lodsb ;numero de componentes
|
|||
|
sub [ebp+color_c],al
|
|||
|
jnz eoi
|
|||
|
mov dh,al
|
|||
|
.l1: mov ebx,[edi]
|
|||
|
mov eax,[ebx]
|
|||
|
stosd
|
|||
|
lodsw
|
|||
|
mov cl,ah
|
|||
|
and eax,0f00h
|
|||
|
and ecx,0f0h
|
|||
|
shr eax,6
|
|||
|
shr ecx,2
|
|||
|
lea ebx,[ebp+ht_ac_ptrs+eax]
|
|||
|
mov eax,[ebx]
|
|||
|
lea ebx,[ebp+ht_dc_ptrs+ecx]
|
|||
|
mov ecx,[ebx]
|
|||
|
test eax,eax
|
|||
|
jz eoi
|
|||
|
test ecx,ecx
|
|||
|
jz eoi
|
|||
|
stosd
|
|||
|
mov eax,ecx
|
|||
|
stosd
|
|||
|
add edi,4
|
|||
|
dec dh
|
|||
|
jnz .l1
|
|||
|
mov edx,[ebp+mcu_ptr]
|
|||
|
cmp edx,modes
|
|||
|
jne .l2
|
|||
|
lea esi,[ebp+q_ptr]
|
|||
|
lea edi,[ebp+q_ptr+32]
|
|||
|
movsd
|
|||
|
movsd
|
|||
|
movsd
|
|||
|
.l2:
|
|||
|
mov esi,edx
|
|||
|
push dword [esi]
|
|||
|
pop dword [ebp+mcu_ptr]
|
|||
|
push dword [esi+4]
|
|||
|
pop dword[ebp+color_ptr]
|
|||
|
push dword [esi+12]
|
|||
|
pop dword [ebp+y_mcu]
|
|||
|
push dword [esi+8]
|
|||
|
pop dword [ebp+x_mcu]
|
|||
|
mov ecx,64*18
|
|||
|
call malloc
|
|||
|
mov [ebp+matrices],edi
|
|||
|
mov ecx,bufer_size
|
|||
|
call malloc
|
|||
|
mov [ebp+sourcebits],edi
|
|||
|
mov esp,[ebp]
|
|||
|
mov [esp+8],ebp
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
jpeg_display:
|
|||
|
test ebp,ebp
|
|||
|
jnz .inicio
|
|||
|
ret
|
|||
|
.inicio:
|
|||
|
pushad
|
|||
|
mov [ebp],esp
|
|||
|
mov eax,[ebp+fichero]
|
|||
|
mov edx,[ebp+position]
|
|||
|
call lseek
|
|||
|
mov edi,[ebp+sourcebits]
|
|||
|
add edi,bufer_size
|
|||
|
mov [ebp+sourcebits_index],edi
|
|||
|
sub edi,2
|
|||
|
mov [ebp+sourcebits_limit],edi
|
|||
|
mov edi,[ebp+matrices]
|
|||
|
mov [ebp+matriz_limit],edi
|
|||
|
xor eax,eax
|
|||
|
mov [esp+8],eax
|
|||
|
mov [ebp+estado],eax
|
|||
|
mov [ebp+tmp_bits],eax
|
|||
|
mov [ebp+dc],eax
|
|||
|
mov [ebp+dc+16],eax
|
|||
|
mov [ebp+dc+32],eax
|
|||
|
|
|||
|
mov eax,[ebp+y_mcu]
|
|||
|
mov ecx,[ebp+y_org]
|
|||
|
sub ecx,eax
|
|||
|
mov [ebp+y_org2],ecx
|
|||
|
mov [ebp+y_mcu2],eax
|
|||
|
push dword [ebp+y_size]
|
|||
|
pop dword [ebp+y_size2]
|
|||
|
.l3: push dword [ebp+x_org]
|
|||
|
pop dword [ebp+x_org2]
|
|||
|
push dword [ebp+x_mcu]
|
|||
|
pop dword [ebp+x_mcu2]
|
|||
|
push dword [ebp+x_size]
|
|||
|
pop dword [ebp+x_size2]
|
|||
|
mov eax,[ebp+y_mcu2]
|
|||
|
add [ebp+y_org2],eax
|
|||
|
sub [ebp+y_size2],eax
|
|||
|
jnc .l4
|
|||
|
add eax,[ebp+y_size2]
|
|||
|
jnz .cont
|
|||
|
mov [esp+8],ebp
|
|||
|
popad
|
|||
|
ret
|
|||
|
.cont:
|
|||
|
mov dword [ebp+y_size2],0
|
|||
|
mov [ebp+y_mcu2],eax
|
|||
|
.l4:
|
|||
|
mov eax,[ebp+x_mcu2]
|
|||
|
sub [ebp+x_size2],eax
|
|||
|
jnc .l5
|
|||
|
add eax,[ebp+x_size2]
|
|||
|
jz .l3
|
|||
|
mov dword [ebp+x_size2],0
|
|||
|
mov [ebp+x_mcu2],eax
|
|||
|
call dword [ebp+mcu_ptr]
|
|||
|
mov eax,[ebp+x_mcu]
|
|||
|
mov ecx,[ebp+x_mcu2]
|
|||
|
mov edx,[ebp+y_mcu2]
|
|||
|
call recortar
|
|||
|
jmp .l6
|
|||
|
.l5:
|
|||
|
call dword [ebp+mcu_ptr]
|
|||
|
mov ecx,[ebp+x_mcu2]
|
|||
|
mov edx,[ebp+y_mcu2]
|
|||
|
.l6:
|
|||
|
mov eax,[ebp+x_org2]
|
|||
|
mov ebx,[ebp+y_org2]
|
|||
|
call dword [ebp+draw_ptr]
|
|||
|
add [ebp+x_org2],ecx
|
|||
|
mov ax,[ebp+estado]
|
|||
|
test al,15
|
|||
|
jz .l4
|
|||
|
cmp ah,8
|
|||
|
jnc .l4
|
|||
|
xor edx,edx
|
|||
|
mov [ebp+tmp_bits],edx
|
|||
|
mov [ebp+dc],edx
|
|||
|
mov [ebp+dc+16],edx
|
|||
|
mov [ebp+dc+32],edx
|
|||
|
add dword [ebp+sourcebits_index],2
|
|||
|
and word [ebp+estado],0c0h
|
|||
|
test al,32
|
|||
|
jz .l4
|
|||
|
jmp .l3
|
|||
|
|
|||
|
color100:
|
|||
|
push edi
|
|||
|
.l1: lodsw
|
|||
|
mov dl,ah
|
|||
|
mov ah,al
|
|||
|
stosw
|
|||
|
mov ah,dl
|
|||
|
stosb
|
|||
|
mov al,dl
|
|||
|
stosb
|
|||
|
stosw
|
|||
|
dec cl
|
|||
|
jnz .l1
|
|||
|
pop edi
|
|||
|
ret
|
|||
|
|
|||
|
color111:
|
|||
|
push edi
|
|||
|
.l1: lodsw
|
|||
|
mov bx,[esi+62]
|
|||
|
mov dx,[esi+126]
|
|||
|
xchg ah,bh
|
|||
|
xchg ah,dl
|
|||
|
xchg ah,bl
|
|||
|
stosw
|
|||
|
mov ax,bx
|
|||
|
stosw
|
|||
|
mov ax,dx
|
|||
|
stosw
|
|||
|
dec cl
|
|||
|
jnz .l1
|
|||
|
pop edi
|
|||
|
mov ecx,64*3
|
|||
|
jmp ybr_bgr
|
|||
|
|
|||
|
color411:
|
|||
|
push ebp
|
|||
|
push edi
|
|||
|
lea ebp,[esi+ecx*8]
|
|||
|
.l1: push ecx
|
|||
|
mov ax,[esi]
|
|||
|
mov cx,[ebp]
|
|||
|
mov dx,[ebp+64]
|
|||
|
add ebp,2
|
|||
|
xchg ch,dl
|
|||
|
mov bx,ax
|
|||
|
mov ah,cl
|
|||
|
mov bl,ch
|
|||
|
mov [edi],ax
|
|||
|
mov [edi+2],bx
|
|||
|
mov [edi+4],cx
|
|||
|
mov ax,[esi+8]
|
|||
|
mov bh,ah
|
|||
|
mov ah,cl
|
|||
|
mov [edi+48],ax
|
|||
|
mov [edi+48+2],bx
|
|||
|
mov [edi+48+4],cx
|
|||
|
mov ax,[esi+2]
|
|||
|
mov bx,ax
|
|||
|
mov ah,dl
|
|||
|
mov bl,dh
|
|||
|
mov [edi+6],ax
|
|||
|
mov [edi+2+6],bx
|
|||
|
mov [edi+4+6],dx
|
|||
|
mov ax,[esi+8+2]
|
|||
|
mov bh,ah
|
|||
|
mov ah,dl
|
|||
|
mov [edi+48+6],ax
|
|||
|
mov [edi+48+2+6],bx
|
|||
|
mov [edi+48+4+6],dx
|
|||
|
pop ecx
|
|||
|
add edi,12
|
|||
|
dec ecx
|
|||
|
add esi,4
|
|||
|
test cl,1
|
|||
|
jnz .l1
|
|||
|
add esi,64-8
|
|||
|
test cl,2
|
|||
|
jnz .l1
|
|||
|
sub esi,128-16
|
|||
|
add edi,48
|
|||
|
test cl,15
|
|||
|
jnz .l1
|
|||
|
add esi,64
|
|||
|
test cl,cl
|
|||
|
jnz .l1
|
|||
|
pop edi
|
|||
|
pop ebp
|
|||
|
mov ecx,64*4*3
|
|||
|
jmp ybr_bgr
|
|||
|
|
|||
|
color211:
|
|||
|
push ebp
|
|||
|
push edi
|
|||
|
lea ebp,[esi+ecx*4]
|
|||
|
.l1: push ecx
|
|||
|
mov ax,[esi]
|
|||
|
mov cx,[ebp]
|
|||
|
mov dx,[ebp+64]
|
|||
|
add ebp,2
|
|||
|
xchg ch,dl
|
|||
|
mov bx,ax
|
|||
|
mov ah,cl
|
|||
|
mov bl,ch
|
|||
|
mov [edi],ax
|
|||
|
mov [edi+2],bx
|
|||
|
mov [edi+4],cx
|
|||
|
mov ax,[esi+2]
|
|||
|
mov bx,ax
|
|||
|
mov ah,dl
|
|||
|
mov bl,dh
|
|||
|
mov [edi+6],ax
|
|||
|
mov [edi+2+6],bx
|
|||
|
mov [edi+4+6],dx
|
|||
|
pop ecx
|
|||
|
add edi,12
|
|||
|
dec cl
|
|||
|
add esi,4
|
|||
|
test cl,1
|
|||
|
jnz .l1
|
|||
|
add esi,64-8
|
|||
|
test cl,2
|
|||
|
jnz .l1
|
|||
|
sub esi,128-8
|
|||
|
test cl,cl
|
|||
|
jnz .l1
|
|||
|
pop edi
|
|||
|
pop ebp
|
|||
|
mov ecx,64*3*2
|
|||
|
jmp ybr_bgr
|
|||
|
|
|||
|
|
|||
|
mcu411: lea ebx,[ebp+q_ptr]
|
|||
|
call hufdecode
|
|||
|
lea ebx,[ebp+q_ptr]
|
|||
|
call hufdecode
|
|||
|
mcu211: lea ebx,[ebp+q_ptr]
|
|||
|
call hufdecode
|
|||
|
mcu111: lea ebx,[ebp+q_ptr]
|
|||
|
call hufdecode
|
|||
|
lea ebx,[ebp+q_ptr+16]
|
|||
|
call hufdecode
|
|||
|
mcu100: lea ebx,[ebp+q_ptr+32]
|
|||
|
call hufdecode
|
|||
|
mov esi,[ebp+matrices]
|
|||
|
mov dword [ebp+matriz_limit],esi
|
|||
|
mov ecx,32
|
|||
|
lea edi,[esi+64*6]
|
|||
|
jmp dword [ebp+color_ptr]
|
|||
|
|
|||
|
cargar_bits: ;edx=bits,cl=nbits,
|
|||
|
;bp=data struct
|
|||
|
;cr: cl,edx,eax,si
|
|||
|
;ncr bx,bp,di,ch
|
|||
|
|
|||
|
mov esi,[ebp+sourcebits_index]
|
|||
|
cmp esi,[ebp+sourcebits_limit]
|
|||
|
jnc .l6
|
|||
|
movzx eax,byte [esi]
|
|||
|
inc esi
|
|||
|
add cl,8
|
|||
|
cmp al,-1
|
|||
|
je .l2
|
|||
|
mov ah,al
|
|||
|
lodsb
|
|||
|
add cl,8
|
|||
|
cmp al,-1
|
|||
|
je .l2
|
|||
|
.l1: ror eax,cl
|
|||
|
or edx,eax
|
|||
|
mov [ebp+sourcebits_index],esi
|
|||
|
ret
|
|||
|
.l2: lodsb
|
|||
|
test al,al
|
|||
|
jnz .l3
|
|||
|
mov al,-1
|
|||
|
call .l1
|
|||
|
cmp cl,16
|
|||
|
jc cargar_bits
|
|||
|
ret
|
|||
|
.l3: sub esi,2
|
|||
|
sub cl,8
|
|||
|
sub al,0d0h
|
|||
|
cmp al,8
|
|||
|
jc .l4
|
|||
|
sub al,9
|
|||
|
mov al,63
|
|||
|
jz .l4
|
|||
|
mov al,127
|
|||
|
.l4: inc al
|
|||
|
or [ebp+estado],al
|
|||
|
movzx eax,ah
|
|||
|
jmp .l1
|
|||
|
.l5: mov [ebp+sourcebits_limit],edi
|
|||
|
mov word [edi],0d9ffh
|
|||
|
popad
|
|||
|
jmp cargar_bits
|
|||
|
.l6: ;read file
|
|||
|
pushad
|
|||
|
mov ecx,bufer_size-2
|
|||
|
mov edx,[ebp+sourcebits_limit]
|
|||
|
mov edi,[ebp+sourcebits]
|
|||
|
mov ax,[edx]
|
|||
|
sub edx,edi
|
|||
|
stosw
|
|||
|
sub esi,edx
|
|||
|
mov [ebp+sourcebits_index],esi
|
|||
|
cmp edx,ecx
|
|||
|
jne .l5
|
|||
|
mov eax,[ebp+fichero]
|
|||
|
call read
|
|||
|
lea ecx,[edi+ecx-2]
|
|||
|
mov [ebp+sourcebits_limit],ecx
|
|||
|
popad
|
|||
|
jmp cargar_bits
|
|||
|
|
|||
|
|
|||
|
hufdecode: ;si->dctable [bp+20]->actable di->outbufer edx->bits cl->bits en edx
|
|||
|
|
|||
|
|
|||
|
;[bp+24]->sourcebits
|
|||
|
;[bp+22]=outbufer+128
|
|||
|
;[bx] q ptr para aa&n
|
|||
|
;[bx+2] a ptr
|
|||
|
;[bx+4] d ptr
|
|||
|
;[bx+8] dc componente
|
|||
|
fninit
|
|||
|
push dword [ebx]
|
|||
|
mov cl,[ebp+nbits]
|
|||
|
mov edx,[ebp+tmp_bits]
|
|||
|
cmp cl,16
|
|||
|
jnc .l1
|
|||
|
call cargar_bits
|
|||
|
.l1: mov eax,[ebx+4]
|
|||
|
mov esi,[ebx+8]
|
|||
|
mov [ebp+actable],eax
|
|||
|
movzx eax,word [esi]
|
|||
|
add esi,2
|
|||
|
.l2: add edx,edx
|
|||
|
jnc .l3
|
|||
|
add esi,eax
|
|||
|
.l3: lodsw
|
|||
|
test ax,ax
|
|||
|
jns .l2
|
|||
|
;codigo encontrado
|
|||
|
and ax,7f0fh
|
|||
|
mov edi,[ebp+matriz_limit] ;arrays
|
|||
|
sub cl,ah
|
|||
|
jns .l4
|
|||
|
fldz
|
|||
|
.error:
|
|||
|
xor ecx,ecx
|
|||
|
or byte [ebp+estado],32
|
|||
|
jmp .l12
|
|||
|
.l4: cmp cl,al
|
|||
|
jnc .l5
|
|||
|
push eax
|
|||
|
call cargar_bits
|
|||
|
pop eax
|
|||
|
.l5: sub cl,al
|
|||
|
mov ch,cl
|
|||
|
mov cl,al
|
|||
|
mov eax,edx
|
|||
|
shl edx,cl
|
|||
|
sar eax,17
|
|||
|
xor ax,8000h
|
|||
|
xor cl,15
|
|||
|
sar ax,cl
|
|||
|
mov cl,ch
|
|||
|
mov ch,2
|
|||
|
add ax,8000h ;incrementar si negativo
|
|||
|
adc ax,8000h
|
|||
|
add [ebx+12],ax
|
|||
|
fild word [ebx+12]
|
|||
|
push ecx
|
|||
|
mov ecx,64
|
|||
|
xor eax,eax
|
|||
|
add [ebp+matriz_limit],ecx
|
|||
|
rep stosd
|
|||
|
pop ecx
|
|||
|
sub edi,64*4
|
|||
|
mov ebx,[esp]
|
|||
|
fmul dword [ebx]
|
|||
|
.l6: cmp cl,16
|
|||
|
jnc .l7
|
|||
|
call cargar_bits
|
|||
|
.l7: mov esi,[ebp+actable]
|
|||
|
movzx eax,word[esi]
|
|||
|
add esi,2
|
|||
|
.l8: add edx,edx
|
|||
|
jnc .l9
|
|||
|
add esi,eax
|
|||
|
.l9: lodsw
|
|||
|
test ax,ax
|
|||
|
jns .l8
|
|||
|
;codigo encontrado
|
|||
|
and ah,127
|
|||
|
xor ebx,ebx
|
|||
|
sub cl,ah
|
|||
|
js .error
|
|||
|
or bl,al
|
|||
|
jz .l12
|
|||
|
and al,0f0h
|
|||
|
shr al,3
|
|||
|
add ch,al
|
|||
|
js .error
|
|||
|
and bl,0fh
|
|||
|
jz .l11
|
|||
|
cmp cl,bl
|
|||
|
jnc .l10
|
|||
|
call cargar_bits
|
|||
|
.l10: sub cl,bl
|
|||
|
xchg bl,cl
|
|||
|
mov eax,edx
|
|||
|
shl edx,cl
|
|||
|
sar eax,17
|
|||
|
xor cl,15
|
|||
|
xor ax,8000h
|
|||
|
sar ax,cl
|
|||
|
add ax,8000h ;incrementar si negativo
|
|||
|
adc ax,8000h
|
|||
|
mov cl,bl
|
|||
|
mov bl,ch
|
|||
|
mov [ebp+tmp_bits],ax
|
|||
|
mov ax,[ebx+zigzag]
|
|||
|
mov ebx,[esp]
|
|||
|
fild word [ebp+tmp_bits]
|
|||
|
or [ebp+idct],ax
|
|||
|
and eax,11111100b
|
|||
|
fmul dword [ebx+eax]
|
|||
|
fstp dword [edi+eax]
|
|||
|
.l11: add ch,2
|
|||
|
jns .l6
|
|||
|
.l12: mov [ebp+nbits],cl
|
|||
|
mov [ebp+tmp_bits],edx
|
|||
|
xor ebx,ebx
|
|||
|
add esp,4
|
|||
|
xchg ebx,[ebp+idct]
|
|||
|
cmp ch,2
|
|||
|
je idctf1
|
|||
|
fstp dword [edi]
|
|||
|
test bh,0feh
|
|||
|
jnz idctf3
|
|||
|
idctf2a: test bh,1
|
|||
|
mov esi,edi
|
|||
|
jz .l1
|
|||
|
test bl,1
|
|||
|
jnz idctf3
|
|||
|
push idctf2b
|
|||
|
jmp idctf3b
|
|||
|
.l1: call idctf3a
|
|||
|
mov cl,4
|
|||
|
call limit
|
|||
|
mov eax,[edi-8]
|
|||
|
mov edx,[edi-4]
|
|||
|
mov cl,7
|
|||
|
.l2: mov [edi],eax
|
|||
|
mov [edi+4],edx
|
|||
|
add edi,8
|
|||
|
dec cl
|
|||
|
jnz .l2
|
|||
|
ret
|
|||
|
|
|||
|
idctf1: fistp word[edi+64]
|
|||
|
mov ax,128
|
|||
|
add ax,[edi+64]
|
|||
|
jz .l2
|
|||
|
test ah,ah
|
|||
|
jz .l1
|
|||
|
mov al,-1
|
|||
|
js .l2
|
|||
|
.l1: mov ah,al
|
|||
|
stosw
|
|||
|
stosw
|
|||
|
mov eax,[edi-4]
|
|||
|
mov ecx,15
|
|||
|
rep stosd
|
|||
|
.l2: ret
|
|||
|
|
|||
|
idctf3: mov bl,8
|
|||
|
mov esi,edi
|
|||
|
.l1: rcr bh,1
|
|||
|
jc .l3
|
|||
|
mov eax,[esi]
|
|||
|
test eax,eax
|
|||
|
jz .l4
|
|||
|
mov cl,7
|
|||
|
.l2: add esi,32
|
|||
|
mov [esi],eax
|
|||
|
dec cl
|
|||
|
jnz .l2
|
|||
|
sub esi,32*7-4
|
|||
|
dec bl
|
|||
|
jnz .l1
|
|||
|
jmp .l5
|
|||
|
.l3: call idctf3b
|
|||
|
.l4: add esi,4
|
|||
|
dec bl
|
|||
|
jnz .l1
|
|||
|
.l5: mov esi,edi
|
|||
|
mov cl,8
|
|||
|
.l6: call idctf3a
|
|||
|
add esi,32
|
|||
|
add edi,16
|
|||
|
dec cl
|
|||
|
jnz .l6
|
|||
|
sub edi,128
|
|||
|
mov esi,edi
|
|||
|
mov cl,32
|
|||
|
limit: mov dx,[esi]
|
|||
|
mov bx,[esi+2]
|
|||
|
add esi,4
|
|||
|
add dx,128
|
|||
|
add bx,128
|
|||
|
test dh,dh
|
|||
|
mov ax,dx
|
|||
|
jz .l1
|
|||
|
mov al,0
|
|||
|
js .l1
|
|||
|
mov al,-1
|
|||
|
.l1: test bh,bh
|
|||
|
mov ah,bl
|
|||
|
jz .l2
|
|||
|
mov ah,0
|
|||
|
js .l2
|
|||
|
mov ah,-1
|
|||
|
.l2: stosw
|
|||
|
dec cl
|
|||
|
jnz limit
|
|||
|
ret
|
|||
|
|
|||
|
idctf2b:
|
|||
|
mov dl,8
|
|||
|
.l1: fld dword[esi]
|
|||
|
add esi,32
|
|||
|
mov ax,128
|
|||
|
fistp word [edi]
|
|||
|
add ax,[edi]
|
|||
|
test ah,ah
|
|||
|
jz .l2
|
|||
|
mov al,0
|
|||
|
js .l2
|
|||
|
mov al,-1
|
|||
|
.l2: mov ah,al
|
|||
|
stosw
|
|||
|
stosw
|
|||
|
stosw
|
|||
|
stosw
|
|||
|
dec dl
|
|||
|
jnz .l1
|
|||
|
ret
|
|||
|
|
|||
|
idctf3a: ;si(d float),di(w int) ncr
|
|||
|
fld dword[esi+1*4] ;f1 ;t21=f1+f7
|
|||
|
fld st0
|
|||
|
fld dword[esi+7*4] ;f7
|
|||
|
fadd st2,st0
|
|||
|
fsubp st1,st0 ;t22=f1-f7
|
|||
|
fld dword[esi+5*4]
|
|||
|
fld st0 ;f5 ;t23=f5+f3
|
|||
|
fld dword[esi+3*4] ;f3
|
|||
|
fadd st2,st0
|
|||
|
fsubp st1,st0 ;t20=f5-f3
|
|||
|
fld st0
|
|||
|
fadd st0,st3 ;t25=(t20+t22)*k2
|
|||
|
fmul dword[k+4] ;k2 ;t25,t20,t23,t22,t21
|
|||
|
fld st4 ;t7=t21+t23
|
|||
|
fadd st0,st3 ;t7,t25,t20,t23,t22,t21
|
|||
|
fld dword[k+12] ;k4 ;t6=k4*t20+t25-t7
|
|||
|
fmulp st3,st0
|
|||
|
fsub st2,st0
|
|||
|
fld st1
|
|||
|
faddp st3,st0 ;t7,t25,t6,t23,t22,t21
|
|||
|
fld st5 ;t5=(t21-t23)*k1-t6
|
|||
|
fsub st0,st4
|
|||
|
fmul dword[k] ;k1
|
|||
|
fsub st0,st3
|
|||
|
fstp st6 ;t7,t25,t6,t23,t22,t5
|
|||
|
fstp st3 ;t25,t6,t7,t22,t5
|
|||
|
fxch st3
|
|||
|
fmul dword[k+8] ;k3 ;t4=k3*t22-t25+t5
|
|||
|
fadd st0,st4 ;t22*k3+t5,t6,t7,t25,t5
|
|||
|
fsubrp st3,st0 ;t6,t7,t4,t5
|
|||
|
fld dword[esi] ;f0 ;t10=f0+f4
|
|||
|
fst st5 ;f0,t4,t5,t6,t7,f0
|
|||
|
fld dword[esi+4*4] ;f4
|
|||
|
fsub st6,st0 ;t11=f0-f4
|
|||
|
faddp st1,st0
|
|||
|
fld st0 ;t10,t10,t6,t7,t4,t5,t11
|
|||
|
fld dword[esi+2*4] ;f2 ;t13=f2+f6
|
|||
|
fadd dword[esi+6*4] ;f6 ;t13,t10,t10,t6,t7,t4,t5,t11
|
|||
|
fadd st2,st0 ;t13,t10,t0,t6,t7,t4,t5,t11 ;t0=t10+t13
|
|||
|
fsubp st1,st0 ;t3,t0,t6,t7,t4,t5,t11 ;t3=t10-t13
|
|||
|
fld st0 ;p3=t3-t4
|
|||
|
fsub st0,st5
|
|||
|
fistp word [edi+3*2] ;p3
|
|||
|
fadd st0,st4 ;p4=t3+t4
|
|||
|
fld dword[esi+2*4] ;f2
|
|||
|
fstp st5
|
|||
|
fistp word [edi+4*2] ;p4 ;t0,t6,t7,f2,t5,t11
|
|||
|
fld st0 ;p0=t0+t7
|
|||
|
fsub st0,st3
|
|||
|
fistp word [edi+7*2] ;p7
|
|||
|
fadd st0,st2 ;p7=t0-t7
|
|||
|
fistp word [edi] ;p0 ;t6,t7,f2,t5,t11
|
|||
|
fld st2 ;f2 ;f2,t6,t7,f2,t5,t11 ;t12=(f2-f6)*k1-t13
|
|||
|
fld dword[esi+6*4] ;f6
|
|||
|
fadd st4,st0 ;f6,f2,t6,t7,t13,t5,t11
|
|||
|
fsubp st1,st0
|
|||
|
fmul dword[k] ;k1
|
|||
|
fsub st0,st3
|
|||
|
fst st3 ;t12,t6,t7,t12,t5,t11
|
|||
|
fadd st0,st5 ;t1=t11+t12
|
|||
|
fst st2 ;t1,t6,t1,t12,t5,t11
|
|||
|
fadd st0,st1 ;p1=t1+t6
|
|||
|
fistp word [edi+2] ;p1 ;t6,t1,t12,t5,t11
|
|||
|
fsubp st1,st0 ;p6=t1-t6
|
|||
|
fistp word [edi+6*2] ;p6 ;t12,t5,t11
|
|||
|
fsubp st2,st0 ;t2=t11-t12 ;t5,t2
|
|||
|
fld st0
|
|||
|
fadd st0,st2 ;p2=t2+t5
|
|||
|
fistp word [edi+2*2] ;p2
|
|||
|
fsubp st1,st0 ;p5=t2-t5 ;t5,t2
|
|||
|
fistp word [edi+5*2]
|
|||
|
ret ;p5
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
idctf3b: ;si ncr
|
|||
|
fld dword[esi+1*32]
|
|||
|
fld st0 ;f1 ;t21=f1+f7
|
|||
|
fld dword[esi+7*32]
|
|||
|
fadd st2,st0 ;f7
|
|||
|
fsubp st1,st0 ;t22=f1-f7
|
|||
|
fld dword[esi+5*32]
|
|||
|
fld st0 ;f5 ;t23=f5+f3
|
|||
|
fld dword[esi+3*32] ;f3
|
|||
|
fadd st2,st0
|
|||
|
fsubp st1,st0
|
|||
|
fld st0 ;t20=f5-f3
|
|||
|
fadd st0,st3 ;t25=(t20+t22)*k2
|
|||
|
fmul dword[k+4] ;k2 ;t25,t20,t23,t22,t21
|
|||
|
fld st4 ;t7=t21+t23
|
|||
|
fadd st0,st3 ;t7,t25,t20,t23,t22,t21
|
|||
|
fld dword[k+12] ;k4 ;t6=k4*t20+t25-t7
|
|||
|
fmulp st3,st0
|
|||
|
fsub st2,st0
|
|||
|
fld st1
|
|||
|
faddp st3,st0 ;t7,t25,t6,t23,t22,t21
|
|||
|
fld st5 ;t5=(t21-t23)*k1-t6
|
|||
|
fsub st0,st4
|
|||
|
fmul dword[k] ;k1
|
|||
|
fsub st0,st3
|
|||
|
fstp st6 ;t7,t25,t6,t23,t22,t5
|
|||
|
fstp st3
|
|||
|
fxch st3 ;t25,t6,t7,t22,t5
|
|||
|
fmul dword[k+8] ;k3 ;t4=k3*t22-t25+t5
|
|||
|
fadd st0,st4 ;t22*k3+t5,t6,t7,t25,t5
|
|||
|
fsubrp st3,st0 ;t6,t7,t4,t5
|
|||
|
fld dword[esi] ;f0 ;t10=f0+f4
|
|||
|
fst st5 ;f0,t4,t5,t6,t7,f0
|
|||
|
fld dword[esi+4*32] ;f4
|
|||
|
fsub st6,st0 ;t11=f0-f4
|
|||
|
faddp st1,st0
|
|||
|
fld st0 ;t10,t10,t6,t7,t4,t5,t11
|
|||
|
fld dword[esi+2*32] ;f2 ;t13=f2+f6
|
|||
|
fadd dword[esi+6*32] ;f6 ;t13,t10,t10,t6,t7,t4,t5,t11
|
|||
|
fadd st2,st0 ;t13,t10,t0,t6,t7,t4,t5,t11 ;t0=t10+t13
|
|||
|
fsubp st1,st0 ;t3,t0,t6,t7,t4,t5,t11 ;t3=t10-t13
|
|||
|
fld st0 ;p3=t3-t4
|
|||
|
fsub st0,st5
|
|||
|
fstp dword[esi+3*32] ;p3
|
|||
|
fadd st0,st4 ;p4=t3+t4
|
|||
|
fld dword[esi+2*32] ;f2
|
|||
|
fstp st5
|
|||
|
fstp dword[esi+4*32] ;p4 ;t0,t6,t7,f2,t5,t11
|
|||
|
fld st0
|
|||
|
fsub st0,st3 ;p0=t0+t7
|
|||
|
fstp dword[esi+7*32] ;p7
|
|||
|
fadd st0,st2 ;p7=t0-t7
|
|||
|
fstp dword[esi] ;p0 ;t6,t7,f2,t5,t11
|
|||
|
fld st2 ;f2 ;f2,t6,t7,f2,t5,t11 ;t12=(f2-f6)*k1-t13
|
|||
|
fld dword[esi+6*32] ;f6
|
|||
|
fadd st4,st0 ;f6,f2,t6,t7,t13,t5,t11
|
|||
|
fsubp st1,st0
|
|||
|
fmul dword[k] ;k1
|
|||
|
fsub st0,st3
|
|||
|
fst st3 ;t12,t6,t7,t12,t5,t11
|
|||
|
fadd st0,st5 ;t1=t11+t12
|
|||
|
fst st2 ;t1,t6,t1,t12,t5,t11
|
|||
|
fadd st0,st1 ;p1=t1+t6
|
|||
|
fstp dword[esi+1*32] ;p1 ;t6,t1,t12,t5,t11
|
|||
|
fsubp st1,st0 ;p6=t1-t6
|
|||
|
fstp dword[esi+6*32] ;p6 ;t12,t5,t11
|
|||
|
fsubp st2,st0
|
|||
|
fld st0 ;t2=t11-t12 ;t5,t2
|
|||
|
fadd st0,st2 ;p2=t2+t5
|
|||
|
fstp dword[esi+2*32] ;p2
|
|||
|
fsubp st1,st0 ;p5=t2-t5 ;t5,t2
|
|||
|
fstp dword[esi+5*32]
|
|||
|
ret ;p5
|
|||
|
|
|||
|
ybr_bgr: ;edi=bmp ecx=n_BYTES
|
|||
|
;retorna edi+=ecx
|
|||
|
pushad
|
|||
|
mov esi,edi
|
|||
|
add edi,ecx
|
|||
|
push edi
|
|||
|
mov edi,[colortabla]
|
|||
|
.l1: lodsw
|
|||
|
movzx ebx,ah
|
|||
|
movzx ebp,al
|
|||
|
movzx eax,al
|
|||
|
movzx ecx,byte[esi]
|
|||
|
lea ebx,[ebx*4+edi+1024]
|
|||
|
lea ecx,[ecx*4+edi]
|
|||
|
add eax,[ebx] ;cb ;solo se usan 16 bits
|
|||
|
mov edx,[ebx+2] ;pero el codigo de 32 bits es mas rapido
|
|||
|
mov ebx,[ecx] ;cr
|
|||
|
add eax,[ecx+2]
|
|||
|
add ebx,ebp ;b
|
|||
|
add edx,ebp ;r
|
|||
|
test ah,ah
|
|||
|
jz .l2
|
|||
|
mov al,0
|
|||
|
js .l2
|
|||
|
mov al,-1
|
|||
|
.l2: test dh,dh
|
|||
|
jz .l3
|
|||
|
mov dl,0
|
|||
|
js .l3
|
|||
|
mov dl,-1
|
|||
|
.l3: test bh,bh
|
|||
|
mov dh,al
|
|||
|
jz .l4
|
|||
|
mov bl,0
|
|||
|
js .l4
|
|||
|
mov bl,-1
|
|||
|
.l4: mov [esi-2],dx
|
|||
|
mov [esi],bl
|
|||
|
inc esi
|
|||
|
cmp esi,[esp]
|
|||
|
jc .l1
|
|||
|
pop edi
|
|||
|
popad
|
|||
|
ret
|
|||
|
|
|||
|
recortar: ;edi=bufer eax=ancho en pixels (ecx,edx)tama<6D>o deseado
|
|||
|
pushad
|
|||
|
dec edx
|
|||
|
jz .l2
|
|||
|
lea ebx,[ecx*3]
|
|||
|
lea eax,[eax*3]
|
|||
|
lea esi,[edi+eax]
|
|||
|
add edi,ebx
|
|||
|
sub eax,ebx
|
|||
|
.l1: mov ecx,ebx
|
|||
|
call movedata
|
|||
|
add esi,eax
|
|||
|
dec edx
|
|||
|
jnz .l1
|
|||
|
.l2: popad
|
|||
|
ret
|
|||
|
|
|||
|
;R = Y + 1.402 *(Cr-128)
|
|||
|
;G = Y - 0.34414*(Cb-128) - 0.71414*(Cr-128)
|
|||
|
;B = Y + 1.772 *(Cb-128)
|
|||
|
|
|||
|
colortabla: dd 0
|
|||
|
|
|||
|
colorprecalc: ;prepara la tabla para convertir ycb a rgb
|
|||
|
mov ecx,1024*2
|
|||
|
call malloc
|
|||
|
mov [colortabla],edi
|
|||
|
fninit
|
|||
|
fld dword [.k+4]
|
|||
|
fld dword [.k]
|
|||
|
mov dl,0
|
|||
|
call .l1
|
|||
|
fld dword [.k+12]
|
|||
|
fld dword[.k+8]
|
|||
|
.l1: mov cx,-128
|
|||
|
.l2: mov [edi],ecx
|
|||
|
inc ecx
|
|||
|
fild word[edi]
|
|||
|
fld st0
|
|||
|
fmul st0,st2
|
|||
|
fistp word[edi]
|
|||
|
fmul st0,st2
|
|||
|
fistp word[edi+2]
|
|||
|
add edi,4
|
|||
|
inc dl
|
|||
|
jnz .l2
|
|||
|
ret
|
|||
|
|
|||
|
.k: dd 1.402,-0.71414,-0.34414,+1.772
|