Hola,
Creo que entendiste mal el funcionamiento del sistema.
Al hacer un OUT al puerto 0x20 eso inicia la transmisión del dato. La finalización de dicha transmisión está señalada por la generación de la interrupción intSalida. Una vez recibida dicha interrupción es que podés iniciar el envío de un nuevo dato.
En tu solución dentro de intSalida ya realizas el OUT de todos los datos pendientes del buffer, cuando hay que esperar luego de cada OUT que se genere una interrupción que indique que el dato fue enviado.
Por otro lado el buffer lo estás "descargando" en el orden inverso al que fueron llegando los datos (como si fuese una pila y no una cola). Los datos se deberían enviar en el órden en que llegaron.
Luego sobre la rutina que atiende intEntrada, no es necesario llamar a disable() porque cuando se entra en la rutina las interrupciones están deshabilitadas. No importa que las habilites en el medio, cuando se genere una nueva interrupción igualmente la rutina va a arrancar con las interrupciones deshabilitadas.
Tampoco deberías habilitarlas en tu caso. Luego de habilitarlas lo único que hacés es actualizar algunas variables, realizar un OUT y terminar la rutina. Incluso al habilitarlas podría pasar que te interrumpan en ese momento antes de haber actualizado tu estado que es justamente lo que deberías tratar de evitar.
Sobre tu duda de utilizar funciones auxiliares, se pueden utilizar sin problemas.
Saludos,
Gustavo