/*Ejercicio 5 P7: Datos: Maquina Dedicada. 4 lineas de entrada -> tienen un controlador asociado. ultimo bit de EST_CONT_n nos dice si llamo o no el controlador. es el controlador que activa la rutina intentrada(); 1 linea de salida -> tengo que mandar por salida n y dato_n que son 2 bytes, pero datos_S saca de a byte y lo hace mediante la interrupcion intsalida(); buffer ->voy guardando las cosas que tienen que ir saliendo maxbuffer Inventario: Main intestado intsalida */ int MAX_BUFFER; //nos dice la cantidad maxima de bytes que puede tener el buffer lo asumo par y como dato bool hay_dato_S; bool lleno_b; int fin; char dato; void interrupt intentrada(){ //precondicion los bits que no se usan los supongo en 0 if (IN(0x10) & 0x01) then { disable(); //por teo vienen deshabilitadas pero como las habilite a mano las deshabilito, quiero evitar que se me desfasen los datos if(! hay_dato_S) then { //mando a la salida hay_dato_S = true; dato = IN(0x11); //solo manda de a byte y esos bits no se usan enable(); OUT(0x20, 0x00); //llama a int salida } else { //cargo en el buffer porque la salida esta ocupada if (!lleno_b) { //cargo en el buffer n y dato buffer[fin+2] = 0x00; buffer[fin+1] = IN(0x11); fin = fin + 2; lleno_b = (fin < MAX_BUFFER); } } } if (IN(0x12) & 0x01) then { disable(); if(! hay_dato_S) then { //mando a la salida enable(); hay_dato_S = true; dato = IN(0x13); OUT(0x20, 0x01); //llama a int salida } else { //cargo en el buffer porque la salida esta ocupada if (!lleno_b) { //cargo en el buffer n y dato buffer[fin+2] = 0x01; buffer[fin+1] = IN(0x13); fin = fin + 2; lleno_b = (fin < MAX_BUFFER); } } } if (IN(0x14) & 0x01) then { disable(); if(! hay_dato_S) then { //mando a la salida enable(); hay_dato_S = true; dato = IN(0x15); OUT(0x20, 0x02); //llama a int salida } else { //cargo en el buffer porque la salida esta ocupada if (!lleno_b) { //cargo en el buffer n y dato //asumo que el buffer comienza en 0x21 y termina en 0x(21 + MAX_BUFFER) buffer[fin+2] = 0x02; buffer[fin+1] = IN(0x15); fin = fin + 2; lleno_b = (fin < MAX_BUFFER); } } } if (IN(0x16) & 0x01) then { if(! hay_dato_S) then { //mando a la salida enable(); hay_dato_S = true; dato = IN(0x17); OUT(0x20, 0x03); //llama a int salida } else { //cargo en el buffer porque la salida esta ocupada if (!lleno_b) { //cargo en el buffer n y dato //asumo que el buffer comienza en 0x21 y termina en 0x(21 + MAX_BUFFER) buffer[fin+2] = 0x03; buffer[fin+1] = IN(0x17); fin = fin + 2; lleno_b = (fin < MAX_BUFFER); } } } } void interrupt intsalida(){ if (hay_dato_S) then { //lo saco la entrada hay_dato_S = false; OUT(0x20,dato); //saco el dato fin--; } while (fin != 0) { //saco todos los elementos que me quedaron pendientes OUT(0x20, buffer[fin]); //seria problematico hacer un enable porque podria mechar cosas intentrada fin--; } } void main concentrador(){ fin = 0; lleno_b = false; hay_dato_S = false; {inicializo las interrupciones} while(true){ } }