Symetrie by Řrřola [web]
; __ _______ __ ; \_|/\||_||/\|_/ ; // /||_||\ \\ ; /symetrie 256b\ ; intrrro by Rrrola ;rrrolaATgmailDOTcom ; greets to everyone with a six-letter name ; use the keyboard to control speed ZOOM equ 66 org 100h ; assume si=100h bp=9??h dx=cs ;Initialization mov ax,13h int 10h ; MCGA video mode add dh,al ; needs 76+76+64 = 216kB free memory mov ds,dx add dh,al ; ds: blue plane mov fs,dx ; fs: orange plane Q push 0a000h ; es: screen pop es ; ss: fpu<>cpu ;Palette: 4 bits black>red>yellow | 4 bits black>blue salc ; al = 0 mov dx,3C8h out dx,al inc dx P or ax,0000111111000011b push ax ; ax = rrrr1111 11bbbb11 shr ax,10 out dx,al mul al shr ax,6 out dx,al ; g = r*r pop ax out dx,al inc ax ; b overflows to r jnz P rdtsc mov [ss:si],eax ; T = random() ;Main loop M fninit inc dword[ss:si] fild dword[ss:si] mov [bp+si],al fidiv word[bp+si] ; {t = ++T/scancode} fldpi fmul st1 fsin fld st1 fsin fadd st0 fldl2e fmul st3 fsin ; {u=sin(1.443*t) v=2*sin(t) w=sin(3.142*t) t} ;Blit, fade out F mov ah,[fs:di] ; combine planes mov al,[di] ; screen = (Orange & 0xF0) + (Blue>>4 & 0x0F) shr ax,4 and al,1111b sub [fs:di],ah ; Orange *= 15/16, Blue *= 15/16 sub [di],al aad 16 ; ah=0 stosb loop F ; cx=0 mov di,32000+160 ; center of the screen ;Gaussian blur (both planes) mov bx,321 ; 1 2 1 G std ; 2 4 2 / 16 B mov dl,[fs:si] ; 1 2 1 lodsb add [bx+si],al rcr byte[bx+si],1 add [fs:bx+si],dl rcr byte[fs:bx+si],1 loop B neg bx cld js B ; +/- pass shr bx,7 fld st2 ; {y=u x=v u v w t} jnz G ; vertical/horizontal pass ;Iteration loop I push ds ; P = Blue inc eax ; RAND++, set sign flag imul eax,byte 3 ; RAND*=3, set carry flag ;If (!carry), rotate by 240 degrees jc C mov dword[bp+si],0xBF000003 R fmul dword[bp+si] fild word[bp+si] ; c = cos(4pi/3) = -1/2 fsqrt ; s = sin(4pi/3) = -sqrt(3)/2 fmul st1 fxch st2 ; {x cy sy u v w t} cmc jc R ; run twice: {cy cx sx sy u v w t} fsubrp st2 faddp st2 ; {y=-sx+cy x=cx+sy u v w t} ;If (!sign), apply circle inversion and translation C js S push fs pop ds ; P = Orange jnc D fadd st2 ; if (carry) y+=u D fld st1 fmul st0 fld st1 fmul st0 faddp st1 ; {x*x+y*y y x u v w t} fldlg2 jnc E fmul st5 E fdivrp st1 ; r = (carry ? lg2*v : lg2) / (x*x+y*y) fmul st2,st0 fmulp st1 ; {y*=r x*=r u v w t} jnc S fadd st4 ; if (carry) y+=w ;Convert coords, clip, draw pixel S mov byte[bp+si],ZOOM*5/6 ; upper byte is zero fld st0 fimul word[bp+si] fistp word[bp+di] ; iy = y*ZOOMY imul bx,[bp+di],320 jo O ; if (|iy|>102), don't draw (can be "jc") mov byte[bp+si],ZOOM fld st1 fimul word[bp+si] fistp word[bp+di] ; ix = x*ZOOMX, don't bother with overflow add bx,[bp+di] ; adr = (iy+100)*320 + ix+160 mov dl,255 sub dl,[bx+di] shr dl,5 ; blend with max color add [bx+di],dl ; P[adr] = (255 + P[adr]*31)/32 neg bx add [bx+di],dl ; central symmetry O pop ds loop I ;Keycheck, exit in al,60h dec ax ;-) ah=0 from blit and 65536 iterations jnz near M mov al,3 int 10h ; text mode ret
[ back to the prod ]