Оказалось что проблема возникает из-за того, что момент чтения FIFO совпадает с моментом записи новых данных контроллером клавиатуры. более редкое чтение уменьшает вероятность потери данных, но чтобы было совсем правильно, нужно использовать бит прерывания от контроллера клавиатуры.