А узнавание логического устройства - тут да, не просто.
По сути единственный метод (кроме использования LOOKUP/CSTAT) - получение адреса $PNAME, скан его вверх до -1 и на основе этого вычисление длины таблиц $UNAM1 и $UNAM2.
Что-то вроде этого:
Код:
MOV @#$SYPTR,R5 ;R5 -> RTDATA
ADD $PNPTR(R5),R5 ;R5 -> $PNAME
MOV R5,R4 ;R4 -> $PNAME
10$: CMP #-1,(R4)+ ;SEARCH FOR END OF $ENTRY
BNE 10$ ;
TST -(R4) ;R4 -> $PNAME + <$SLOT*2>
SUB R5,R4 ;R4 -> <$SLOT*2>
ADD #8.,R4 ;R4 -> COMBINED TABLE SIZE
ASR R4 ;R4 -> $UNAM(1,2) SIZE
Теперь отняв от R5 R4 один раз - получаем таблицу $UNAM2 (логические имена), а отняв от него еще рз R4 получаем $UNAM1 (физические имена). Причем сканить надо всю таблицу с начала и до первого совпадения - записей для DK к примеру может быть две :)
В V5.6/5.7 (может и 5.5) правда есть смещение от рмона с длиной таблицы, но на старых не сработает.
И еще нюансик: в 5.6/5.7 в таблице имен физическое имя будет всегда коротким если система умеет 64 унита на устройство (D00, D01 итд вместо DU0, DU1).