Practico 8 -2012- Ejercicio 5

Practico 8 -2012- Ejercicio 5

de Pablo German Olivera Riffran -
Número de respuestas: 0
Buenas,

Tomando algunas sugerencias que me dieron en el práctico, la idea es:

INT_ENTRADA
Chequear el estado de los 4 controladores.
En caso que haya datos disponibles, leer, para que apague el bit0, luego,
si hay espacio en el buffer se guarda, en caso contrario se pierde el dato leído.

INT_SALIDA
Si el buffer tiene datos, se los transmite a la salida, si está vacío se transmite FF.

Se agradece cualquier sugerencia y/o corrección.

Gracias, Saludos.

Implementación:
#define MAX .... // Tamaño del buffer

char buffer[MAX];
int read, write;

int IsFull() {
// retorna true, cuando en el buffer no hay espacio para dos bytes
return ( (write == read) | ((write + 1) % MAX == read) );
} // end IsFull

void interrupt INT_ENTRADA() {

// Se chequea cual/es DATO_n tiene un dato disponible y
// que el buffer tenga espacio para n y el dato
char dato;

if (IN(0x10) & 0x01 == 1) {
dato = IN(0x11); // Se lee el dato disponible
if ( !IsFull() ) {
buffer[write] = 0; // se guarda el numero n
write = (write + 1) % MAX;
buffer[write] = dato; // se guarda el dato
write = (write + 1) % MAX;
}
}

if (IN(0x12) & 0x01 == 1) {
dato = IN(0x13); // Se lee el dato disponible
if ( !IsFull() ) {
buffer[write] = 1; // se guarda el numero n
write = (write + 1) % MAX;
buffer[write] = dato; // se guarda el dato
write = (write + 1) % MAX;
}
}

if (IN(0x14) & 0x01 == 1) {
dato = IN(0x15); // Se lee el dato disponible
if ( !IsFull() ) {
buffer[write] = 2; // se guarda el numero n
write = (write + 1) % MAX;
buffer[write] = IN(0x15); // se guarda el dato
write = (write + 1) % MAX;
}
}

if (IN(0x16) & 0x01 == 1) {
dato = IN(0x17); // Se lee el dato disponible
if ( !IsFull() ) {
buffer[write] = 3; // se guarda el numero n
write = (write + 1) % MAX;
buffer[write] = dato; // se guarda el dato
write = (write + 1) % MAX;
}
}
} // end INT_ENTRADA

void interrupt INT_SALIDA() {

if ( write != read ) { // Hay datos en el buffer
OUT(0x20,buffer[read]);
read = (read + 1) % MAX;
}
else { // buffer vacio
OUT(0x20,FF);
}

} // end INT_SALIDA


int main() {

Disable();
// Instalar interrupciones
read = 0;
write = 0;
enable();

while (true);

} // end main