/* Fractal na tela */ #include "us.h" #define NTLINHAS 786 // n£mero de linhas na tela #define NTCOLUNAS 1024 // n£mero de colunas na tela #define NFLINHAS 480 // n£mero de linhas no fractal #define NFCOLUNAS 640 // n£mero de colunas no fractal // Define as cores a serem usadas para o status de cada fil¢sofo. // Essas cores sĘo usadas para diferencia um fil¢sofo quando est  // COMENDO, COMFOME, PENSANDO OU TERMINADO. #define VERDE 123 #define AZUL 5 #define VERMELHO 24 #define BRANCO 255 #define PRETO 0 // os poss”veis valores para o status de um fil¢sofo #define COMENDO VERDE #define COMFOME AZUL #define PENSANDO BRANCO #define TERMINADO VERMELHO // numero do pr¢prio filosofo e dos vizinhos dword self, left, right; // endere‡os do pr¢prio status e daquele dos vizinhos //word status, status_left, status_right; // endere‡os de in”cio, fim e incremento para a reta a ser ordenada dword reta_ini, reta_fim, reta_inc; typedef byte tela[NTLINHAS][NTCOLUNAS]; // variaveis float xini,yini; // coordenadas do ponto dentro do fractal dword xpix,ypix; // posi‡„o do pixel na tela do video //endere‡o de linha e coluna resp. dword linha, coluna; dword my_status; // prototypes void desenhar_fractal(); void filho(); void status(int s); // A primeira rotina deve ser o main void main() { int filosofos,linha_ctr,coluna_ctr,self_ctr_linha,self_ctr_coluna,i; /* Disposi‡„o dos fil¢sofos na tela n£mero do fil¢sofo <-- left right --> ^ ³ 480 481 482 ... 1120 ³ ÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ r ³ © o o o ... o © = origem da tela (endere‡o 0) i ³ o = pixel indicando status g 479³ o ž ž ž ... ž ž = pixel a ser ordenado h ³ t 478³ o ž ž ž ... ž ³ l ...³... ... ... ... ... ... e ³ f 2³ o ž ž ž ... ž t ³ ³ 1³ o ž ž ž ... ž V ³ */ // Inicialmente o fil¢sofo tem seu status alterado para PENSANDO. status(PENSANDO); // O fractal ‚ desenhada na tela. desenhar_fractal(); linha_ctr = 480; coluna_ctr = 1; self_ctr_linha = 1; self_ctr_coluna = 480; // Cria‡Ęo de todos os fil¢sofos a partir do processo pai utilizando // o sytem call fork. SĘo criados 3 fil¢sofos na posi‡Ęo vertical e // horizontal alternadamente. // cria o processo filho atrav‚s do system call fork(). // Depois chama a subrotina filho() que ‚ respons vel por // controlar a vida do fil¢sofo. Essa subrotina, altera o status // do fil¢sofo para COMFOME, despois verifica se ‚ poss”vel comer, // come. E por fim ‚ alterado seu status para TERMINADO. //  na subrotina filho() que sĘo feitas as chamadas ao system call // wait() e signal(). for(filosofos=0;filosofos<160;filosofos++) { for(i=0;i<3;i++) { coluna = 0; linha = linha_ctr--; self = self_ctr_linha++; if(fork()) filho(); coluna = coluna_ctr++; linha = 0; self = self_ctr_coluna++; if(fork()) filho(); } // Como existe uma maior quantidade de fil¢sofos na posi‡Ęo horizontal //(nas colunas) ‚ criado mais um fil¢sofo nesta posi‡Ęo. coluna = coluna_ctr++; linha = 0; self = self_ctr_coluna++; if(fork()) filho(); } //Terminei de enforcar... linha=0; coluna=0; // Aqui o status do fil¢sofo ‚ alterado para terminado. status(TERMINADO); // Por fim ‚ feita o sytem call terminate para terminar o processo do //usu rio. terminate(); } /* Subrotina que altera o status do fil¢sofo para o status passado no parametro. Essa subrotina ir  mudar a cor do fil¢sofo de acordo com o status passado. status pensando cor branco. status comfome cor azul. status comendo cor verde. status terminado cor vermelho. */ void inline status(int s) { register a = s; tela far *video = VIDEO_FP(0); (*video)[linha][coluna] = a; my_status = a; } /* Subrotina que desenha o conhecido fractal na tela. */ 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. */ tela far *video = VIDEO_FP(0); byte pix; // valor do pixel for(yini=-1.15, ypix=1; 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) (*video)[ypix][xpix] = pix; // for(i=1; i<100; i++); } } } /* Subrotina que retorna o status do vizinho da esquerda do fil¢sofo. */ byte status_left() { tela far *video = VIDEO_FP(0); register myself = self; if(myself == 1) return (*video)[0][640]; else if(myself == 480) return (*video)[1][0]; else if(myself < 480) return (*video)[linha-1][0]; else return (*video)[0][coluna-1]; } /* Subrotina que retorna o status do vizinho da direita do fil¢sofo. */ byte status_right() { tela far *video = VIDEO_FP(0); register myself = self; if(myself == 1120) return (*video)[480][0]; else if(myself == 479) return (*video)[0][1]; else if(myself > 479) return (*video)[0][coluna+1]; else return (*video)[linha+1][0]; } /* Subrotina que faz o fil¢sofo comer uma certa quantidade de macarrĘo. Essa quantidade ‚ passada como parametro na subrotina. O resultado ‚ a ordena‡Ęo dos pixel na tela. Utiliza o algoritmo buble sort para a ordena‡Ęo. Essa subrotina retorna se o fil¢sofo est  satisfeito ou nĘo. */ int come(int quant) { tela far *video = VIDEO_FP(0); static int i,j; int limit; byte temp; register myself = self; limit = i + quant; if(myself < 480) { for(i=1;(i