Конечно наверное это не очень
эффективно (в смысле затрат памяти) - использовать символьные имена для работы с п/п ПЗУ :D (я бы даже более сказал :D) однако имеет право на жизнь хотя бы потому, что такие функции никогда не перекроют друг друга.
Например:
call PrintChar
А если взять безликий
RST 16
defb 81
defb 12
то тому, кто будет писать такую п/п будет необходимо будет держать в руках справочник чтобы смотреть соответствие между вызываемой функцией и её байтами описателями (те самые defb) - такую работу должен выполнять не программист, а машина.
Да и запомнить символьное имя PrintChar в любом случае проще.
Кроме того, символьные имена хорошо жмутся (5 бит используют из 8, если даже взять спецсимволы то 6 бит из 8, или скажем обработать хаффманом), так что трёхсимвольное имя будет кушать практически столько же места сколько вызов через DefB.
P.S. Под перекрытием я подразумеваю возможность вызова разных функций при том же синтаксисе - PrintChar либо не оттранслируется вообще, потому что нет такой функции, либо будет транслироваться замечательно. Rst Defb Defb при смене набора функций придётся отслеживать. Первый Defb отвечает за группу функций - если после обновления версии случилось так что группа расширилась за 256 значений функций, то придётся ещё один номер группы резервировать и это в свою очередь головняк и головняк