Index of /ukdwk_archive/ukncbtlwebcomplekt/Other/form_rsxlib2
Обновление библиотеки
(http://zx-pk.ru/threads/10718-soft-dlya-dvk-pdp11.html?p=893359&viewfull=1#post893359)
Подпрограммы табличного парсера (TPARS) перенесены в секцию кода библиотеки.
Обновление библиотеки RSXLIB. (RSXLIB 2.0)
Добавлены макрокоманды и подпрограмма лексического
разбора строк (ISTAT$, STATE$, TRAN$). Сама библиотека
соответственно разделилась на две библиотеки:
объектную (RSXLIB.OBJ) и макробиблиотеку (RSXLIB.MLB).
Описание библиотеки тут>
http://zx-pk.ru/showthread.php?t=10718&page=16&p=583946&viewfull=1#post583946
http://zx-pk.ru/showthread.php?t=10718&p=583948&viewfull=1#post583948
Описание работы с лексическим разбором
можно найти в
RSX-11M/M+/MicroRSX/IAS I/O
Operations Reference Manual.
Теперь программу cvt можно собрать прямо в RT-11:
Код:
.MAC SY:RSXLIB/LIB+CVT/OB
.LIN/LINK:SY:RSXLIB CVT
(пояснения от автора)
полезные подпрограммы (для MACRO программ) из RSX в RT-11.
Некоторые из них уже есть в SYSLIB, некоторые есть в ULBLIB из source kit,
но многое отсутствует.
Перенесены следующие подпрограммы:
$CAT5, $CAT5B, $CBDAT, $CBDMG, $CBDSG,
$CBDT4, $CBOMG, $CBOSG, $CBTA, $CBTMG,
$CDDMG, $CDTB, $COTB, $CVTUC, $DAT,
$DAT4, $DATS, $DDIV, $DIV, $DMUL,
$EDMSG, $MUL, $SAVAL, $TIM, .DD2CT, .OD2CT.
Подробное описание подпрограмм можно найти
в документации по системной библиотеке RSX.
Краткое описание доступно в RSXном хелпе
(можно посмотреть на CTAKAHе командой
HELP SYSL subname
(где submane - имя подпрограммы без знака $).
Работа с подпрограммами полностью совместима с RSX
за двумя исключениями:
Подпрограмма $DATS
(перевод даты в ASCII с учетом системного формата)
работает как $DAT4 (перевод в формат DD-MMM-YYYY)
В подпрограмме $EDMSG форматная директива %X
использует первые 4 слова 5-словного блока имени файла.
Формат блока имени аналогичен используемому в директивах RT-11.
Если поле имени устройства пустое, выводится только имя файла.
Подпрограммы сохранения регистров предназначены для использования
в своих подпрограммах когда нужно сохранить регистры на время их
выполнения и восстановить при возврате.
Код:
CALL $SAVAL ;СОХРАНЯЕТ ВСЕ РЕГИСТРЫ
JSR R5,$SAVRG ;СОХРАНЯЕТ РЕГИСТРЫ 3-5
JSR R2,$SAVVR ;СОХРАНЯЕТ РЕГИСТРЫ 0-2
JSR R5,.SAVR1 ;СОХРАНЯЕТ РЕГИСТРЫ 1-5
Данные подпрограммы вызываются в начале своей подпрограммы и сохраняют
определенные регистры (см выше). Содержимое регистров сохраняется таким же
как до сохранения. При возврате из подпрограммы регистры восстанавливается.
Бит C не изменяется при восстановлении.
Подпрограммы арифметики выполняют операции умножения и деления без использования
команд EIS.
Код:
;БЕЗЗНАКОВОЕ УМНОЖЕНИЕ ОДИНАРНОЙ ТОЧНОЧТИ
;
;ВХОД: ВЫХОД:
;R0 - МНОЖИТЕЛЬ R0 - ПРОИЗВЕДЕНИЕ (СТАРШАЯ ЧАСТЬ)
;R1 - МНОЖИМОЕ R1 - ПРОИЗВЕДЕНИЕ (МЛАДШАЯ ЧАСТЬ)
;
CALL $MUL
;БЕЗЗНАКОВОЕ ДЕЛЕНИЕ ОДИНАРНОЙ ТОЧНОЧТИ
;
;ВХОД: ВЫХОД:
;R0 - ДЕЛИМОЕ R0 - ЧАСТНОЕ
;R1 - ДЕЛИТЕЛЬ R1 - ОСТАТОК
;
CALL $DIV
;УМНОЖЕНИЕ ДВОЙНОЙ ТОЧНОСТИ
;
;ВХОД: ВЫХОД:
;R0 - МНОЖИТЕЛЬ R0 - ПРОИЗВЕДЕНИЕ (СТАРШАЯ ЧАСТЬ)
;R2 - МНОЖИМОЕ (СТАРШАЯ ЧАСТЬ) R1 - ПРОИЗВЕДЕНИЕ (МЛАДШАЯ ЧАСТЬ)
;R3 - МНОЖИМОЕ (МЛАДШАЯ ЧАСТЬ)
;
CALL $DMUL
;ДЕЛЕНИЕ ДВОЙНОЙ ТОЧНОСТИ
;
;ВХОД: ВЫХОД:
;R0 - ДЕЛИТЕЛЬ (БЕЗ ЗНАКА) R0 - ОСТАТОК
;R1 - ДЕЛИМОЕ (СТАРШАЯ ЧАСТЬ) R1 - ЧАСТНОЕ (СТАРШАЯ ЧАСТЬ)
;R3 - ДЕЛИМОЕ (МЛАДШАЯ ЧАСТЬ) R2 - ЧАСТНОЕ (МЛАДШАЯ ЧАСТЬ)
;
CALL $DDIV
Подпрограммы преобразования данных позволяют конвертировать данные
в текстовый формат и обратно.
Код:
;ASCII -> ЧИСЛО ДВОЙНОЙ ТОЧНОСТИ
;ДЕСЯТИЧНОЕ (.DD2CT) ИЛИ ВОСЬМЕРИЧНОЕ (.OD2CT) СО ЗНАКОМ.
;
;ВХОД: ВЫХОД:
;R3 - АДРЕС ДВУХСЛОВНОГО БУФЕРА CC/CS - УСПЕХ/ОШИБКА
;R4 - КОЛИЧЕСТВО СИМВОЛОВ В СТРОКЕ
;R5 - АДРЕС ИСХОДНОЙ СТРОКИ
;
CALL .DD2CT
CALL .OD2CT
;ASCII -> ЧИСЛО ОДИНАРНОЙ ТОЧНОСТИ
;ДЕСЯТИЧНОЕ ($CDTB) ИЛИ ВОСЬМЕРИЧНОЕ ($COTB).
;
;ВХОД: ВЫХОД:
;R0 - АДРЕС СТРОКИ R0 - АДРЕС СЛЕДУЮЩЕГО СИМВОЛА
; R1 - ЧИСЛО
; R2 - СИМВОЛ НА КОТОРОМ ПРЕОБРАЗОВАНИЕ
; ОСТАНОВИЛОСЬ
;
CALL $CDTB
CALL $COTB
;ASCII -> RADIX-50
;1-3 СИМВОЛА БЕЗ ПРОБЕЛОВ ($CAT5) ИЛИ С ПРОБЕЛАМИ ($CAT5B).
;
;ВХОД: ВЫХОД:
;R0 - АДРЕС СТРОКИ R0 - АДРЕС СЛЕДУЮЩЕГО СИМВОЛА
;R1 - ПАРАМЕТРЫ ПРЕОБРАЗОВАНИЯ R1 - ЗНАЧЕНИЕ
; 0 - ТОЧКА = КОНЕЦ R2 - СИМВОЛ НА КОТОРОМ ПРЕОБРАЗОВАНИЕ
; 1 - ТОЧКА = СИМВОЛ ОСТАНОВИЛОСЬ
; CC/CS - УСПЕХ/ОШИБКА
;
CALL $CAT5
CALL $CAT5B
;ЧИСЛО ОДИНАРНОЙ ТОЧНОСТИ -> ASCII
;ДЕСЯТИЧНОЕ ОТ 0 ДО 99 ($CBDAT), ДЕСЯТИЧНОЕ ОТ 0 ДО 9999 ($CBDT4),
;ДЕСЯТИЧНОЕ ($CBDMG), ДЕСЯТИЧНОЕ СО ЗНАКОМ ($CBDSG), ВОСЬМЕРИЧНОЕ ($CBOMG),
;ВОСЬМЕРИЧНОЕ СО ЗНАКОМ ($CBOSG), ВОСЬМЕРИЧНОЕ ОДНОБАЙТОВОЕ ($CBTMG)
;
;ВХОД: ВЫХОД:
;R0 - АДРЕС БУФЕРА R0 - АДРЕС СЛЕДУЮЩЕГО СИМВОЛА
;R1 - ЧИСЛО
;R2 - ПАРАМЕТРЫ ПРЕОБРАЗОВАНИЯ
; 0 - ПОДАВЛЯТЬ НАЧАЛЬНЫЕ НУЛИ
; НЕ 0 - НЕ ПОДАВЛЯТЬ
;
CALL $CBDAT
CALL $CBDT4 ;XX ЕСЛИ R1 < 1900, XXXX ЕСЛИ R1 >= 1900
CALL $CBDMG
CALL $CBDSG
CALL $CBOMG
CALL $CBOSG
CALL $CBTMG
;ЧИСЛО ДВОЙНОЙ ТОЧНОСТИ -> ASCII
;
;ВХОД: ВЫХОД:
;R0 - АДРЕС БУФЕРА R0 - АДРЕС СЛЕДУЮЩЕГО СИМВОЛА
;R1 - АДРЕС ДВУСЛОВНОГО ЧИСЛА
;R2 - ПАРАМЕТРЫ ПРЕОБРАЗОВАНИЯ
; 0 - ПОДАВЛЯТЬ НАЧАЛЬНЫЕ НУЛИ
; НЕ 0 - НЕ ПОДАВЛЯТЬ
;
CALL $CDDMG
;ЧИСЛО ОДИНАРНОЙ ТОЧНОСТИ -> ASCII
;
;ВХОД: ВЫХОД:
;R0 - АДРЕС БУФЕРА R0 - АДРЕС СЛЕДУЮЩЕГО СИМВОЛА
;R1 - ЧИСЛО
;R2 - ПАРАМЕТРЫ ПРЕОБРАЗОВАНИЯ
; БИТЫ 0-7 - ОСНОВАНИЕ (2-10)
; БИТ 8 - ЧИСЛО СО ЗНАКОМ
; БИТ 9 - НЕ ПОДАВЛЯТЬ НУЛИ
; БИТ 10 - ШИРИНА ПОЛЯ (1-31)
;
CALL $CBTA
;ASCII НИЖНИЙ РЕГИСТР -> ВЕРХНИЙ РЕГИСТР
;
;ВХОД: ВЫХОД:
;R0 - АДРЕС ИСХОДНОЙ СТРОКИ R0, R1 - НЕ МЕНЯЮТСЯ
;R1 - АДРЕС БУФЕРА R2 - 0
;R2 - КОЛИЧЕСТВО СИМВОЛОВ
;
CALL $CVTUC
;ДАТА -> ASCII
;DD-MMM-YY ($DAT), DD-MMM-YYYY ($DAT4, $DATS)
;
;ВХОД: ВЫХОД:
;R0 - АДРЕС БУФЕРА R0 - АДРЕС СЛЕДУЮЩЕГО СИМВОЛА
;R1 - АДРЕС ТРЕХСЛОВНОГО МАССИВА
; +00 - ГОД-1900
; +02 - МЕСЯЦ
; +04 - ДЕНЬ
;
CALL $DAT
CALL $DAT4
CALL $DATS
;ВРЕМЯ -> ASCII
;
;ВХОД: ВЫХОД:
;R0 - АДРЕС БУФЕРА R0 - АДРЕС СЛЕДУЮЩЕГО СИМВОЛА
;R1 - АДРЕС ПЯТИСЛОВНОГО МАССИВА
; +00 - ЧАСЫ
; +02 - МИНУТЫ
; +04 - СЕКУНДЫ
; +06 - ТИКИ
; +10 - ТИКОВ В СЕКУНДУ
;R2 - ПАРАМЕТРЫ ПРЕОБРАЗОВАНИЯ
; 1 - HH
; 2 - HH:MM
; 3 - HH:MM:SS
; 4 - HH:MM:SS.S
;
CALL $TIM
Подпрограммы $TIM, $EDMSG, $DAT, $DAT4 и $DATS
работают с временем в формате, возвращаемом RSXной директивой GTIM$.
Формат описан выше. Для упрощения была добавлена подпрограмма $GTTIM
которая на входе получает адрес 8-словного буфера в R1 и заполняет
его датой и временем в формате GTIM$.
Подпрограмма форматирования данных $EDMSG упрощает подготовку данных
для вывода на экран, принтер или в файл.
Код:
;ФОРМАТИРОВАННЫЙ ВЫВОД
;
;ВХОД:
;R0 - АДРЕС БУФЕРА R0 - АДРЕС СЛЕДУЮЩЕГО СИМВОЛА
;R1 - АДРЕС ФОРМАТНОЙ СТРОКИ
;R2 - АДРЕС БЛОКА АРГУМЕНТОВ
;
CALL $EDMSG
Форматная строка состоит из текста и директив форматирования и завершается
нулевым байтом. Формат директив: "%nX" где n - количество использования
директивы, X - символ директивы. Вместо n можно использовать символ "V" -
в этом случае количество берется из очередного слова блока аргументов.
Если в директиве указано количество использования, результаты разделяются
знаками табуляции (кроме директив %A, %E для которых количество используется
как длина строки). Блок аргументов представляет собой последовательные слова,
содержащие аргументы для директив. Не все директивы требуют аргументов.
Директивы работы со строками:
Код:
Директива Аргумент Вывод
--------------------------------------------------------------------------------
%A,%nA,$VA адрес символа/строки символ/строка (n - количество
%E,%nE,%VE адрес символа/строки аналогично %A, непечатные символы
заменяются на пробелы
%I адрес ASCIZ строки вставка в форматную строку
Директивы работы с числами:
Код:
Директива Аргумент Вывод
-----------------------------------------------------------------------------------
%D,%nD,%VD слово десятичное слово со знаком, без заполнения
нулями
%M,%nM,%VM слово десятичное слово без знака, без заполнения
нулями
%U,%nU,%VU слово десятичное слово без знака, с заполнением
нулями
%B,%nB,%VB адрес байта восьмеричный байт без знака, с заполнением
нулями
%O,%nO,%VO слово восьмеричное слово со знаком, без
заполнения нулями
%P,%nP,%VP слово восьмеричное слово без знака, с заполнением
нулями
%T,%nT,%VT адрес двух слов десятичное число двойной точности
без знака, без заполнения нулями
Другие форматы:
Код:
Директива Аргумент Вывод
-----------------------------------------------------------------------------------
%R,%nR,%VR слово в RADIX-50 ASCII строка
%X,%nX,%VX 5-словный блок имени ASCII строка, пробелы удаляются
файла
%Y адрес трех слов вывод даты с использованием $DATS
%1Z адрес 5 слов вывод времени с использованием $TIM, HH
%2Z HH:MM
%3Z HH:MM:SS
%4Z HH:MM:SS.S
Управление:
Код:
Директива Аргумент Вывод
------------------------------------------------------------------------------------
%F,%nF,%VF
%N,%nN,%VN
%S,%nS,%VS пробел
%n< n пробелов, указатель на буфер не сдвигается
%n> дополняет пробелами до n еслин нужно,
значение n должно совпадать с ранее заданным
в директиве %n<
17.11.2016 подпрограмма $GTTIM перемещена в общую секцию кода библиотеки
вместо безымянного PSECT.
Источник авторская публикация на форуме:
http://zx-pk.ru/threads/10718-soft-dlya-dvk-pdp11.html?p=891273&viewfull=1#post891273