I'll add a bit more... The PS/2 uses the upper 6 bits to specify multiple instances of the same device. So, on a PS/2, the first async port is at 03f8h, the second at 02F8h, the third at 3220h, the fourth at 3228h; the fifth at 4220h; the sixth at 4228h; the seventh at 5220h and the eighth at 5228h. All but the first use IRQ3.
On the PC system of interrupts: Remember that the original 5150 used two onboard interrupts for the timer and keyboard and so had 6 to spare--and there were 5 ISA slots, so it was a pretty conservative design. That is, until multifunction boards came along and then the whole scheme fell apart. On-the-motherboard peripherals didn't help either. The 5170 added a second interrupt controller as a slave, adding 7 more interrupts, but those extra interrupts are only available to 16-bit cards.
Had the designers of the PC had a bit more vision, they might have implemented a different interrupt structure. For example, peripherals could assert an interrupt using open-collector drivers, so that as many of them as desired could pull on an IRQ line. If a standard for chaining ISRs had been implemented in software, then an ISR could check to see if its device needed servicing and pass control to the next ISR. The tail of each ISR chain would be the EOI for the interrupt along with an IRET.
Note that it's still possible for something such as a multiport COM board to use its own 8259 PIC and use it to drive a single bus IRQ line as a slave.