Подпрограммы сохранения регистров предназначены для использовании в своих подпрограммах когда нужно сохранить регистры на время их выполнения и восстановить при возврате.
Код:
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 <FF>
%N,%nN,%VN <CR><LF>
%S,%nS,%VS пробел
%n< n пробелов, указатель на буфер не сдвигается
%n> дополняет пробелами до n еслин нужно,
значение n должно совпадать с ранее заданным
в директиве %n<