I've moved m_mpsc->m1_r(); into if() clause like so
if (m_mpsc_irq == 0) {
lower_8088_irq(IRQ_COMM_PTR_INTR_L);
m_mpsc->m1_r();
} else
raise_8088_irq(IRQ_COMM_PTR_INTR_L);
and rx now works (f.e. from a TCP chargen service) but terminal is still broken -- it starts autorepeating first character you press.