Терминология "видит один порт" не подходит - под DOS программа может обрабатывать все что есть в пространстве портов ввода вывода (а для com порта это те самые регистры которые им управляют). Прерывание может быть и одно и два - как позволит контроллер назначать. А вот в обработчике прерывания придется пробегать регистры идентификации прерываний всех com портов, которые назначены на это прерывание , ну и соответственно , в прерывании должны быть обработчики для всех портов.
Чуть вперед забегу. Сталкивался с тем, что обращание к портам ввода вывода в разных машинах по разному работает. В 386 вообще вопросов никаких, а вот при переносе того же текста на 486, код отказывается работать - в программе требуются задержки после операций обращения к портам ввода вывода, если такие обращения идут подряд.
Теоретически в Builder можно написать консольное приложение, вот только его запустить не получиться - оно же будет напрямую по портам лазить , а винда не пустит и будет ругаться.
Но тут экспериментировать надо.