Julia

    -- Sebastian Pawlak, 1997.


Zamieszczony poniżej kod wykreśla w czasie rzeczywistym animację fraktala Julii. W programie użyłem funkcji koprocesora.

; code by TrIx

Code SEGMENT
Assume Cs:Code
.386
.387

org 100h


Start:
 jmp Main

;°°°°°°°°°°°°°°°° Stale i dane °°°°°°°°°°°°°°°°
 a dd 0
 b dd 0
 sw1 db 0
 cx_ dd 0
 cy_ dd 0
 zx dd 0
 zy dd 0
 stx dd 0
 sty dd 0
 min dd -2.0
 max dd 2.0
 pow2 dd 2.0
 pow3 dd 3.5
 krok_X dd 0.0125
 krok_Y dd 0.02
 cx_krok dd 0.01
 cx_krok_min dd -0.01
 pow1_8 dd 1.8
 pow0_8_min dd -0.8
 pow0_7 dd 0.7

;˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛ Poczatek programu ˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛˛
Main:

 mov ax,13h   ; tryb graficzny
 int 10h

 mov dx,3c8h
 mov al,1
 out dx,al
 inc dx
 mov bl, 17

petlapal:
 mov al,bl
 out dx, al
 mov al,0
 out dx, al
 mov al,bl
 add al,5
 shl al,1
 out dx, al

 dec bl
 jne petlapal


;°°°°°°°°°°°°°°°° GLOWNA PETLA PROGRAMU °°°°°°°°°°°°°°°°
 push 0a000h
 pop es

 mov bp,32000
 mov dx,320

petla:   ; petla glowna

 mov di,0
 cld
 mov ax,0

 fld min
 fst sty  ; sty=-2.
 fstp stx ; stx=-2.

  ; petla przelatujaca po poszczegolnych punktach ekranu
 ScreenOffset:

  fld stx
  fstp zx
  fld sty
  fstp zy

  mov ch,0
  mov cl,16
  Iter_petla:   ; for (k=0;k<16;k++)

    fld zx
    fmul st(0),st(0)   ;  a=zx*zx
    fst a

    fld zy
    fmul st(0),st(0)   ; b=zy*zy
    fst b

    faddp st(1),st(0)  ; a*b
    fld pow3
    fcompp st(1),st  ; if (a+b>3) { PutPixel (bufor,i,g,k); goto NextPoint; }

    fstsw ax
    sahf
    jb NextPoint  ; jb

    fld a
    fld b
    fsubp st(1),st
    fld cx_
    faddp st(1),st   ;  NewZx=a-b+cx

    fld zx
    fld zy
    fmulp st(1),st  ; NewZy=2*zx*zy+cy
    fld pow2
    fmulp st(1),st
    fld cy_
    faddp st(1),st

    fstp zy     ; zx=NewZx
    fstp zx      ; zy=NewZy

   dec cl
   jne Iter_petla

   mov cl,7   ; PutPixel (bufor,i,g,20);

 NextPoint:
   mov al,cl   ; PutPixel (bufor,i,g,cl);
   stosb

 NextEnd:

 fld stx
 fld krok_x
 faddp st(1),st
 fstp stx

 dec dx
 jne NicNieRob    ; test konca wiersza

  mov dx,320
  fld min
  fstp stx

 fld sty
 fld krok_y
 faddp st(1),st
 fstp sty

NicNieRob:

 cmp di,bp
 jne ScreenOffset


;Kopiowanie polowy w odbiciu lustrzanym
 mov cx,320*100
 mov di,0
 mov si,64000
kop_X:
 mov al,es:di
 mov es:si,al
 inc di
 dec si

 dec cx
 jne kop_X

 mov es:si,al

 cmp sw1,0
 jne sw1_
 fld cx_
 fld cx_krok
 faddp st(1),st
 fst cx_
 fld pow1_8
 fcompp st(1),st
 fstsw ax
 sahf
 ja sw_end  ; jb
 mov al,1
 mov sw1,al
 jmp sw_end

sw1_:

 fld cx_
 fld cx_krok_min
 faddp st(1),st
 fst cx_
 fld pow0_8_min
 fcompp st(1),st
 fstsw ax
 sahf
 jb sw_end  ; jb
 mov al,0
 mov sw1,al

sw_end:

 fld cy_
 fld pow0_7
 fcompp st(1),st
 fstsw ax
 sahf
 jb cy_end  ; jb
 fld cy_
 fld cx_krok
 faddp st(1),st
 fstp cy_
 cy_end:

;  if (sw1==0) { cx+=0.01; if (cx>1.8) sw1=1; }
;  else if (sw1==1) { cx-=0.01;  if (cx<-0.8) sw1=0; }
;  if (cy<0.7) cy+=0.01;

 mov ah,1
 int 16h
 jz petla


;°°°°°°°°°°°°°°°° Koniec °°°°°°°°°°°°°°°°
; mov ax,03h
; int 10h

 mov ah,09h
 mov dx,offset Info
 int 21h

 mov ah,4ch
 int 21h

Info DB 'TrIx$'

ends
end Start
w3cw3c
automatyka przemysłowa