Собственно на точку можно не проверять. Если не ошибаюсь, MOV R5,R5 только в одном месте делается - именно том самом. Остальные подсказки вроде идут через .GTLIN, а это уже будет R4,R4. Надо будет посмотреть на досуге.
А что до SL, то исходники есть от 5.7
---------- Post added at 14:45 ---------- Previous post was at 14:35 ----------
А узнавание логического устройства - тут да, не просто.
По сути единственный метод (кроме использования LOOKUP/CSTAT) - получение адреса $PNAME, скан его вверх до -1 и на основе этого вычисление длины таблиц $UNAM1 и $UNAM2.
Что-то вроде этого:
Теперь отняв от R5 R4 один раз - получаем таблицу $UNAM2 (логические имена), а отняв от него еще рз R4 получаем $UNAM1 (физические имена). Причем сканить надо всю таблицу с начала и до первого совпадения - записей для DK к примеру может быть двеКод: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
В V5.6/5.7 (может и 5.5) правда есть смещение от рмона с длиной таблицы, но на старых не сработает.
И еще нюансик: в 5.6/5.7 в таблице имен физическое имя будет всегда коротким если система умеет 64 унита на устройство (D00, D01 итд вместо DU0, DU1). Если критично - нужно будет проверять поддержку и использовать расширенную таблицу.






Ответить с цитированием