void interrupt sio_int1()
{
   unsigned char lsr, iir;

   asm cli;

   lsr = inp(com[1]->base+OFS_LSR);  // LSR + IIR lesen
   iir = inp(com[1]->base+OFS_IIR);


   if((iir&IIR_MASK)==IIR_ERROR)   // Fehler!
   {
      if(lsr&LSR_ERROR) com[1]->error++;
   };

   if((iir&IIR_MASK)==IIR_RX)   // Empfangen
   {
      while((inp(com[1]->base+OFS_LSR) & LSR_RX) == LSR_RX)  // Solange Zeichen vorliegen...
      {
         *(com[1]->rx_buf + com[1]->rx_write) = inp(com[1]->base+OFS_RX); // Lesen
         com[1]->rx_write++;                                           // Ringpuffer
         if(com[1]->rx_write == com[1]->rx_size) com[1]->rx_write = 0;
         if(com[1]->rx_write == com[1]->rx_read) com[1]->error++;
         com[1]->rx_sum++;
      };
   };

   if((iir&IIR_MASK)==IIR_TX)   // Senden
   {
      if(com[1]->tx_read!=com[1]->tx_write) // Falls Sendezeichen anliegen...
      {
         outp(com[1]->base+OFS_TX,*(com[1]->tx_buf + com[1]->tx_read));
         com[1]->tx_read++;
         if(com[1]->tx_read == com[1]->tx_size) com[1]->tx_read = 0;
         com[1]->tx_sum++;
      }
      else com[1]->tx_empty = 1;
   };


   if(com[1]->irq > 7)
   {
      outp(PORT8259_2,EOI+(com[1]->irq & 7));
      outp(PORT8259_1,EOI+2);
   }
   else outp(PORT8259_1,EOI+com[1]->irq);

   asm sti;
};

void interrupt sio_int2()
{
   unsigned char lsr, iir;

   asm cli;

   lsr = inp(com[2]->base+OFS_LSR);  // LSR + IIR lesen
   iir = inp(com[2]->base+OFS_IIR);


   if((iir&IIR_MASK)==IIR_ERROR)   // Fehler!
   {
      if(lsr&LSR_ERROR) com[2]->error++;
   };

   if((iir&IIR_MASK)==IIR_RX)   // Empfangen
   {
      while((inp(com[2]->base+OFS_LSR) & LSR_RX) == LSR_RX)  // Solange Zeichen vorliegen...
      {
         *(com[2]->rx_buf + com[2]->rx_write) = inp(com[2]->base+OFS_RX); // Lesen
         com[2]->rx_write++;                                           // Ringpuffer
         if(com[2]->rx_write == com[2]->rx_size) com[2]->rx_write = 0;
         if(com[2]->rx_write == com[2]->rx_read) com[2]->error++;
         com[2]->rx_sum++;
      };
   };

   if((iir&IIR_MASK)==IIR_TX)   // Senden
   {
      if(com[2]->tx_read!=com[2]->tx_write) // Falls Sendezeichen anliegen...
      {
         outp(com[2]->base+OFS_TX,*(com[2]->tx_buf + com[2]->tx_read));
         com[2]->tx_read++;
         if(com[2]->tx_read == com[2]->tx_size) com[2]->tx_read = 0;
         com[2]->tx_sum++;
      }
      else com[2]->tx_empty = 1;
   };

   if(com[2]->irq > 7)
   {
      outp(PORT8259_2,EOI+(com[2]->irq & 7));
      outp(PORT8259_1,EOI+2);
   }
   else outp(PORT8259_1,EOI+com[2]->irq);

   asm sti;
};

void interrupt sio_int3()
{
   unsigned char lsr, iir;

   asm cli;

   lsr = inp(com[3]->base+OFS_LSR);  // LSR + IIR lesen
   iir = inp(com[3]->base+OFS_IIR);


   if((iir&IIR_MASK)==IIR_ERROR)   // Fehler!
   {
      if(lsr&LSR_ERROR) com[3]->error++;
   };

   if((iir&IIR_MASK)==IIR_RX)   // Empfangen
   {
      while((inp(com[3]->base+OFS_LSR) & LSR_RX) == LSR_RX)  // Solange Zeichen vorliegen...
      {
         *(com[3]->rx_buf + com[3]->rx_write) = inp(com[3]->base+OFS_RX); // Lesen
         com[3]->rx_write++;                                           // Ringpuffer
         if(com[3]->rx_write == com[3]->rx_size) com[3]->rx_write = 0;
         if(com[3]->rx_write == com[3]->rx_read) com[3]->error++;
         com[3]->rx_sum++;
      };
   };

   if((iir&IIR_MASK)==IIR_TX)   // Senden
   {
      if(com[3]->tx_read!=com[3]->tx_write) // Falls Sendezeichen anliegen...
      {
         outp(com[3]->base+OFS_TX,*(com[3]->tx_buf + com[3]->tx_read));
         com[3]->tx_read++;
         if(com[3]->tx_read == com[3]->tx_size) com[3]->tx_read = 0;
         com[3]->tx_sum++;
      }
      else com[3]->tx_empty = 1;
   };


   if(com[3]->irq > 7)
   {
      outp(PORT8259_2,EOI+(com[3]->irq & 7));
      outp(PORT8259_1,EOI+2);
   }
   else outp(PORT8259_1,EOI+com[3]->irq);

   asm sti;
};

void interrupt sio_int4()
{
   unsigned char lsr, iir;

   asm cli;

   lsr = inp(com[4]->base+OFS_LSR);  // LSR + IIR lesen
   iir = inp(com[4]->base+OFS_IIR);


   if((iir&IIR_MASK)==IIR_ERROR)   // Fehler!
   {
      if(lsr&LSR_ERROR) com[4]->error++;
   };

   if((iir&IIR_MASK)==IIR_RX)   // Empfangen
   {
      while((inp(com[4]->base+OFS_LSR) & LSR_RX) == LSR_RX)  // Solange Zeichen vorliegen...
      {
         *(com[4]->rx_buf + com[4]->rx_write) = inp(com[4]->base+OFS_RX); // Lesen
         com[4]->rx_write++;                                           // Ringpuffer
         if(com[4]->rx_write == com[4]->rx_size) com[4]->rx_write = 0;
         if(com[4]->rx_write == com[4]->rx_read) com[4]->error++;
         com[4]->rx_sum++;
      };
   };

   if((iir&IIR_MASK)==IIR_TX)   // Senden
   {
      if(com[4]->tx_read!=com[4]->tx_write) // Falls Sendezeichen anliegen...
      {
         outp(com[4]->base+OFS_TX,*(com[4]->tx_buf + com[4]->tx_read));
         com[4]->tx_read++;
         if(com[4]->tx_read == com[4]->tx_size) com[4]->tx_read = 0;
         com[4]->tx_sum++;
      }
      else com[4]->tx_empty = 1;
   };


   if(com[4]->irq > 7)
   {
      outp(PORT8259_2,EOI+(com[4]->irq & 7));
      outp(PORT8259_1,EOI+2);
   }
   else outp(PORT8259_1,EOI+com[4]->irq);

   asm sti;
};

