/* Fractal na tela */ #include "us.h" #define NTLINHAS 480 // n£mero de linhas na tela #define NTCOLUNAS 640 // n£mero de colunas na tela #define NFLINHAS 120 // n£mero de linhas no fractal #define NFCOLUNAS 160 // n£mero de colunas no fractal typedef union { byte cor; struct { dword l0; byte nix1[NTCOLUNAS-4]; // nao toque dword l1; byte nix2[NTCOLUNAS-4]; // nao toque dword l2; byte nix3[NTCOLUNAS-4]; // nao toque dword l3; byte nix4[NTCOLUNAS-4]; // nao toque } p; } ponto; // variaveis float xini,yini; // coordenadas do ponto dentro do fractal dword xpix,ypix; // posi‡„o do pixel na tela do video // prototypes void desenhar_fractal(); void filosofo(int nf); // aqui faz mesmo // A primeira rotina deve ser o main (o fil¢sofo chefe) void main() { int nf; desenhar_fractal(); for(nf=1; nf<178; nf++) // para todos os filosofos if(fork()==0) filosofo(nf); terminate(); } void pintar(int x, int y, byte cor) { // repete a cor para quatro pixeis horizontais dword l = (((((cor <<8)|cor )<<8) |cor)<<8) |cor; // inicializa ponteiro para ponto na coluna x ponto far *p = MK_FP(VIDEO_SEL,x*4); p += y; // avance o pointero do ponto de y linhas p->p.l0 = l; p->p.l1 = l; p->p.l2 = l; p->p.l3 = l; } byte cor(int x, int y) { // inicializa ponteiro para ponto na coluna x ponto far *p = MK_FP(VIDEO_SEL,x*4); return(p[y].cor); } void desenhar_fractal() { /* Calculation of Julia set ------------------------ Written by Kiselev Y. 1994 Definitions of complex numbers: z = x + i*y screen coordinates xini <= x < xini+1024*xstep u = s + i*t parameter \ yini <= y < yini+768*ystep Equation used: f(z) = z^2 - u Iteration: f(z), f(f(z)), f(f(f(z))), ... until |f(...)| > 2 or max_it iterations Result: pixel value at (x,y) is the number of iterations. */ byte pix; // valor do pixel for(yini=-1.15, ypix=0; ypix4.0) break; // |z|=sqrt(x^2+y^2) < 2 xy = x*y; x = x2-y2-0.76; // -s y = xy+xy-0.09; // -t } if (pix>2) pintar(xpix, ypix ,pix); } } } void filosofo(int nf) { terminate(); }