Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- %use altreg
- section .text ; program 64-bitowy
- global drawInMemory
- extern printf
- drawInMemory:
- push rbx
- mov R8, RDI ;pPixelBuffer
- mov R9, RSI ;WIDTH
- sub R9, 1 ; --WIDTH ;na potrzeby petli
- mov R10, RDX ;HEIGHT
- sub R10, 1 ; --HEIGHT ;na potrzeby petli
- movq xmm9, xmm3 ;moveX
- movq xmm10, xmm4 ;moveY
- xor R11, R11 ; pozycja w buforze=0
- mov R12, R9; set CounterX
- xloop:
- mov R13, R10 ;set CounterY
- yloop:
- ;liczenie zx
- pxor xmm4, xmm4 ;xmm4=0
- CVTSI2SD xmm4, r9 ; xmm4 = w
- pierwszy:
- addsd xmm4, [jeden]
- drugi:
- divsd xmm4, [dwa] ; xmm4 /=2 (w/2)
- trzeci:
- pxor xmm3, xmm3 ;xmm3=0
- cvtsi2sd xmm3, r12 ;xmm3=x
- subsd xmm3, xmm4 ; xmm3= x - w/2
- mulsd xmm3, [poltora] ; xmm3 = 1.5 * (x-w/2)
- pxor xmm4, xmm4 ; xmm4=0
- addsd xmm4, xmm2 ; xmm4=zoom
- divsd xmm4, [dwa]; xmm4 = 0.5*zoom
- pxor xmm5, xmm5 ; xmm5=0
- cvtsi2sd xmm5, rsi ; xmm5=w
- mulsd xmm4, xmm5 ; xmm4 = 0.5*zoom*w
- divsd xmm3, xmm4 ; zx = 1.5*(x-w/2)/(0.5*zoom*w)
- addsd xmm3, xmm9 ;zx +=moveX
- ;rejestry xmm4 i xmm5 juz niepotrzebne
- ;rejestr xmm3 nie do zmiany juz
- ;liczenie zy
- pxor xmm5, xmm5 ; xmm5=0
- cvtsi2sd xmm5, rdx ;xmm5=h
- divsd xmm5, [dwa] ; xmm5=h/2
- pxor xmm4, xmm4 ;xmm4=0
- cvtsi2sd xmm4, r13 ;xmm4=y
- subsd xmm4, xmm5 ; xmm4 = y - h/2
- cvtsi2sd xmm5, rdx
- mulsd xmm5, xmm2
- divsd xmm5, [dwa]
- divsd xmm4, xmm5
- dodanie:
- addsd xmm4, xmm10 ;zy += moveY
- ;rejestr xmm5 juz niepotrzebny
- ;rejest xmm3 i xmm4 nie do zmiany
- mov R14, 1000
- pxor xmm5, xmm5 ; xmm5=0
- addsd xmm5, xmm3 ;xmm5 = zx
- mulsd xmm5, xmm5 ;xmm5 = zx*zx
- pxor xmm6, xmm6 ; xmm6=0
- addsd xmm6, xmm4 ; xmm6= zy
- mulsd xmm6, xmm6 ; xmm6=zy*zy
- addsd xmm5, xmm6
- comisd xmm5, [cztery]
- jnb koniec_iteracji
- beginLoop:
- pxor xmm5, xmm5 ;
- addsd xmm5, xmm3
- mulsd xmm5, xmm5
- pxor xmm6, xmm6
- addsd xmm6, xmm4
- mulsd xmm6, xmm6
- subsd xmm5, xmm6
- addsd xmm5, xmm0
- ;xmm6 niepotrzebny juz
- mulsd xmm4, xmm3 ; zy=zy*zx
- mulsd xmm4, [dwa] ; zy=2*zy*zy
- addsd xmm4, xmm1 ;= zy=2*zy*zy+Cy
- pxor xmm3, xmm3 ; zx=0
- addsd xmm3, xmm5 ; zx=tmp
- ;xmm5 juz niepotrzebny
- ;sprawdzam czy wskoczyc znowu do petli czy nie
- pxor xmm5, xmm5 ; xmm5=0
- addsd xmm5, xmm3 ;xmm5 = zx
- mulsd xmm5, xmm5 ;xmm5 = zx*zx
- pxor xmm6, xmm6 ; xmm6=0
- addsd xmm6, xmm4 ; xmm6= zy
- mulsd xmm6, xmm6 ; xmm6=zy*zy
- addsd xmm5, xmm6 ; xmm5=zx*zx+zy*zy
- dec R14 ;decrementing loop counter
- comisd xmm5, [cztery] ; zx * zx + zy * zy >= 4
- jnb koniec_iteracji
- cmp R14, 0
- jnz beginLoop ; i!=0
- koniec_iteracji:
- ;licze kolory
- ; (R,G,B) = (iteracja%256, 255, 0); /* 0x01FF to 0x3FFF */
- xor r15, r15 ; r15=0
- add r15, 1000 ; MAX ITERACJI
- cvtsi2sd xmm7, r15 ;MAX ITERACJI DOUBLE
- sub r15, r14 ; MAX ITERACJI - licznik iteracji = ile zostalo wykonanych iteracji na pikselu
- cvtsi2sd xmm8, r15 ; ile wykonano iteracji na pikselu
- cmp r15, 0 ;pomijam obliczanie koloru dla zerowej ilosci wykonanych iteracji
- jz zero_iteracji
- divsd xmm8, xmm7 ; (0,1] ile procent wykonano iteracji
- mov r15, 255
- cvtsi2sd xmm7, r15 ; 255 double
- mulsd xmm8, xmm7 ; procent * 255, odcien
- roundsd xmm8, xmm8, 9 ;zaokraglenie
- cvttsd2si r15, xmm8 ;jaki odcien
- zapis:
- mov BYTE [R8+R11], r15l ; R=255
- inc R11
- mov BYTE [R8+R11], r15l ; G=al
- inc R11
- mov BYTE [R8+R11], 0 ; B=255
- inc R11
- powrot:
- dec R13
- jns yloop
- endyloop:
- ;end yloop
- dec R12
- jns xloop
- ;end xloop
- end:
- pop rbx
- ret
- zero_iteracji:
- mov BYTE [R8+R11], 255 ; R=255
- inc R11
- mov BYTE [R8+R11], 255 ; G=al
- inc R11
- mov BYTE [R8+R11], 255 ; B=255
- inc R11
- jmp powrot
- jeden:
- dq 1.0e0
- poltora:
- dq 1.5e0
- dwa:
- dq 2.0e0
- pol:
- dq 0.5e0
- cztery:
- dq 4.0e0
- szescdziesiatdwa:
- db 62
- dwapiecpiec:
- db 255
- #ifndef X86_FUNCTION_H_
- #define X86_FUNCTION_H_
- void drawInMemory(unsigned char *pPixelBuffer, int width, int height, double C_real, double C_imaginary, double zoom, double moveX, double moveY);
- #endif // X86_FUNCTION_H_
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement