Версия для печати темы
MAXIOL _ УКНЦ / МС0511 _ ПЗУ УКНЦ
Автор: SuperMax 29.1.2021, 1:17
Код
.TITLE ROM
.ASECT
.=100000 ; Начальный адрес ПЗУ
; ********************************************************************
; * *
; * ПОДПРОГРАММЫ ОБСЛУЖИВАНИЯ МЕНЮ УСТАНОВКА И ЗАГРУЗКА *
; * *
; * Адреса 100000 - 103553 *
; * *
; ********************************************************************
; П/п установки начальных значений в меню УСТАНОВКА и ЗАГРУЗКА
100000$:JSR R5,110712$ ; П/п заносит данные из области
.WORD 100012$,7152 ; по адресу 100012 в 7152
RETURN
100012$:.WORD 10. ; Количество слов
.WORD 177701,0,0 ; Пункт УСТ не выбран, VT-52, 80x24
.WORD 7,1,1,7 ; Цвета символа, знакоместа, экрана и курсора
.WORD 0,0 ; Рулон плавный, таймер включен
.WORD 177701 ; Пункт ЗАГРУЗКА не выбран
; П/п обслуживания главного меню УСТАНОВКА
100040$:TST @#23170 ; Ожидание завершения скроллинга
BNE 100040$
MOV @#2476,-(SP) ; Сохранить адрес пользовательского экрана
MOV #4672,@#2476 ; Включить экран установки
MOV #22754,R5 ; Сделать текущей таблицу видеопараметров
CALL 110210$ ; экрана установки
JSR R5,105346$ ; Перевести клавиатуру в системный режим
.WORD 107310$,11054 ; Данные для системного режима
CALL 104054$ ; Очистить буфер клавиатуры
CLR @#7232 ; Разрешение алфавитно-цифровой клавиатуры
MOV SP,@#7142
EMT 52 ; Вывод УСТ в верхней строке
.WORD 107533$
100120$:EMT 44 ; Вывод заголовка
.WORD 102133$
100124$:MOV #4,R0
JSR R4,101202$ ; Вывод меню и запрос пункта
.WORD 101644$ ; Адрес списка для меню УСТАНОВКА
BMI 100172$ ; Нажата <Enter> или УПР-@ ?
CALL @100150$(R2) ; Обслуживание выбранного пункта
BMI 100172$ ; Нажата <Enter> или УПР-@ ?
BR 100124$
; Адреса п/п обслуживания пунктов меню УСТАНОВКА
100150$:.WORD 100172$,100334$,100372$,100432$,100476$
.WORD 100536$,100576$,100630$,100730$
; Если нажаты <Enter> или УПР-@
100172$:CMP R0,#177772 ; Нажата УПР-@ (выход в монитор ПП) ?
BEQ 100302$
MOV @#7142,SP
EMT 52 ; Стирание в верхней строке надписи УСТ
.WORD 107524$
EMT 52
.WORD 107542$
TST @#7146 ; Предыдущий режим клавиатуры был системным ?
BNE 100232$ ; Да
JSR R5,105400$ ; Восстановить пользовательский режим
.WORD 107310$,11054 ; Данные для пользовательского режима
100232$:CALL 110204$ ; Включение пользовательского экрана
MOV (SP)+,@#2476
CLR @#7070 ; Очистить признак вызова
TST @#7072 ; Вызов происходил из меню ЗАГРУЗКА ?
BNE 100300$ ; Да
100254$:MOV #2,@#7230 ; Установить признак выполнения TRAP 2
MOV #2,@#22546 ; Установить признак выполнения TRAP 4
MOV #2,@#7042 ; Адресовать ASCII-коды клавиатуры каналу 0
TRAP 4 ; Прочесть символ с канала 0 (если есть)
100300$:RETURN
100302$:MOV #14,R0 ; Очистить экран
EMT 42
MOV #100120$,-(SP) ; Адрес возврата в меню УСТАНОВКА
MOV SP,@#7144
JMP @#160576 ; Переход к программе монитора ПП
; П/п обслуживания подменю СИСТЕМА КОМАНД
100324$:CALL @100346(R2) ; Вызов п/п по текущему пункту меню
MOV #4,R0
100334$:JSR R4,101202$ ; Вывод подменю и запрос пункта
.WORD 101672$ ; Адрес списка подменю СИСТЕМА КОМАНД
BEQ 100324$
RETURN
; Адреса п/п для обслуживания подменю СИСТЕМА КОМАНД
100346$:.WORD 162572$,113670$,113712$
; П/п обслуживания подменю ФОРМАТ ЭКРАНА
100354$:MOV R2,R0 ; Получение номера формата
ASR R0 ; 0 - 80x24, 1 - 40x24, 2 - 20x24, 3 - 10x24
DEC R0
CALL 116502$ ; Обращение к п/п установки формата экрана
MOV #2,R0
100372$:JSR R4,101202$ ; Вывод меню и запрос пункта
.WORD 101704$ ; Адрес списка подменю ФОРМАТ ЭКРАНА
BEQ 100354$
RETURN
; П/п для обслуживания подменю ЦВЕТ СИМВОЛА
100404$:MOV R2,R0 ; Получение номера цвета
ASR R0
DEC R0
MOV R5,-(SP) ; Сохранить адрес текущей таблицы видеопар.
MOV #22656,R5 ; Загрузить адрес таблицы экрана пользователя
CALL 116052$ ; Обращение к п/п установки цвета символа
MOV (SP)+,R5
MOV #2,R0
100432$:JSR R4,101202$ ; Вывод меню и запрос пункта
.WORD 101722$ ; Адрес списка подменю ЦВЕТ СИМВОЛА
BEQ 100404$
RETURN
; П/п для обслуживания подменю ЦВЕТ ЗНАКОМЕСТА
100444$:MOV R2,R0 ; Получение номера цвета
SUB #2,R0
MOV 113512$(R0),R0
MOV R5,-(SP)
MOV #22656,R5
CALL 116130$ ; Обращение к п/п установки цвета знакоместа
MOV (SP)+,R5
MOV #2,R0
100476$:JSR R4,101202$
.WORD 101750$ ; Адрес списка подменю ЦВЕТ ЗНАКОМЕСТА
BEQ 100444$
RETURN
; П/п для обслуживания подменю ЦВЕТ ЭКРАНА
100510$:MOV R2,R0 ; Получение номера цвета
ASR R0
DEC R0
MOV R5,-(SP)
MOV #22656,R5
CALL 116170$ ; Обращение к п/п установки цвета экрана
MOV (SP)+,R5
MOV #2,R0
100536$:JSR R4,101202$
.WORD 101776$ ; Адрес списка подменю ЦВЕТ ЭКРАНА
BEQ 100510$
RETURN
; П/п для обслуживания подменю ЦВЕТ КУРСОРА
100550$:MOV R2,R0 ; Получение номера цвета
ASR R0
DEC R0
MOV R5,-(SP)
MOV #22656,R5
CALL 116226$ ; Обращение к п/п установки цвета курсора
MOV (SP)+,R5
MOV #2,R0
100576$:JSR R4,101202$
.WORD 102024$ ; Адрес списка подменю ЦВЕТ КУРСОРА
BEQ 100550$
RETURN
; П/п для обслуживания подменю РУЛОН
100610$:MOV R5,-(SP)
MOV #22656,R5
CALL @<100642$-2>(R2); Обращение к п/п-ам установки рулона
MOV (SP)+,R5
MOV #2,R0
100630$:JSR R4,101202$
.WORD 102052$ ; Адрес списка подменю РУЛОН
BEQ 100610$
RETURN
; Адреса п/п-ам для установки рулона
100642$:.WORD 100650$,100656$,100674$
100650$:CLR @#7136 ; Установить плавный рулон
BR 100664$
100656$:MOV #2,@#7136 ; Установить дискретный рулон
100664$:MOV #2,74(R5) ; Установить присутствие рулона
RETURN ; 74 - смещение в таблице видеопараметров
100674$:CLR 74(R5) ; Установить отсутствие рулона
RETURN
; П/п для обслуживания подменю ТАЙМЕР
100702$:BIS #1000,@#177054 ; Выключить таймер в канале ЦП
SUB #2,R2 ; Текущий пункт - включен ?
BNE 100724$ ; Нет
BIC #1000,@#177054 ; Включить таймер в канале ЦП
100724$:MOV #2,R0
100730$:JSR R4,101202$
.WORD 102066$ ; Адреса списка подменю ТАЙМЕР
BEQ 100702$
RETURN
; П/п обслуживания главного меню ЗАГРУЗКА
100742$:CLR @#7042 ; Направлять ASCII-коды запросам EMT 22
CLR -(SP) ; Номер устройства = 0
100750$:MOV #14,R0 ; Очистить экран
EMT 42
100756$:CLR @SP
JSR R4,101616$ ; Позиционирование курсора
.BYTE 2,5 ; Y=2, X=5
MOV #-6,@#7150 ; Запрет вывода в верхнюю инф. строку
CLR @#23164 ; Разрешение использования курсора
EMT 44 ; Вывод заголовка
.WORD 103114$
101004$:MOV #4,R0
JSR R4,101202$ ; Вывод меню и запрос пункта
.WORD 102100$ ; Адрес списка меню ЗАГРУЗКА
BEQ 100756$
BMI 101146$ ; Нажаты <Enter>,<ИСП> или <0> ?
ADD R2,PC ; Переход по номеру пункта (нажата вправо)
BR 100756$
BR 101044$ ; Диск
BR 101102$ ; Кассета ПЗУ
BR 101004$ ; Сеть
BR 101004$ ; Стык С2
BR 101004$ ; Магнитофон
BR 101004$ ; Отладка
BR 101004$ ; Тестирование
; Запрос номера диска
101044$:JSR R4,101616$ ; Позиционирование курсора
.BYTE 4,34
EMT 22 ; Ввод символа с ожиданием
CMP R0,#33 ; Код Escape ?
BEQ 101142$ ; Да
EMT 42 ; Вывод символа
SUB #60,R0 ; Проверка нажатия <0> - <3>
BMI 100756$
CMP R0,#3
BHI 100756$
BR 101136$
; Запрос номера кассеты ПЗУ
101102$:JSR R4,101616$ ; Позиционирование курсора
.BYTE 5,34
EMT 22 ; Ввод символа с ожиданием
CMP R0,#33 ; Код Escape ?
BEQ 101142$ ; Да
EMT 42 ; Вывод символа
SUB #61,R0 ; Проверка нажатия <1>,<2>
BMI 100756$
CMP R0,#1
BHI 100756$
101136$:MOV R0,@SP ; Сохранение номера устройства
BR 101004$
101142$:EMT 22
BR 100750$
101146$:MOV #14,R0 ; Очистка экрана
EMT 42
CALL 100254$ ; Восстановить пользовательский режим
MOV R2,R0 ; Занести номер пункта в буфер клавиатуры
CALL 104160$
MOVB (SP)+,R0 ; Занести номер устройства в буфер клавиатуры
CALL 104160$
CLR @#7072 ; Очистить признак вызова
RETURN
; П/п вывода пунктов меню и запроса номера пункта
101202$:MOV #-6,@#7150 ; Запрет вывода в верхнюю инф. строку
MOV R0,-(SP)
CALL 101446$ ; Вывод пунктов меню
ADD (SP)+,PC
BR 101432$
BR 101224$
101224$:MOV @R4,R0 ; Позиционирование курсора
MOV 2(R0),R3 ; R3 = координаты
DEC R3
CALL 101564$
MOV @R4,R3 ; R3 = адрес списка
101242$:EMT 22 ; Ввод символа с ожиданием
TST R0 ; Нажата УПР-@ ?
BEQ 101436$
CMP R0,#33 ; Символ Escape ?
BEQ 101306$
SUB #60,R0 ; Символы <0> - <9> ?
BMI 101276$
BEQ 101442$ ; Символ <0> ?
CMP R0,@R3 ; Не превышает номер последнего пункта ?
BHI 101242$
MOV R0,R2 ; R2 = номер выбранного пункта
BR 101404$
101276$:ADD #43,R0 ; Нажата <Enter> (15(8)-60(8)+43(8)=0) ?
BEQ 101442$
BR 101404$
101306$:EMT 22
SUB #176,R0 ; Нажаты <ПОМ>,<ИСП> или стрелки
BMI 101242$
CMP R0,#6
BHIS 101242$
ASL R0
ADD R0,PC
BR 101344$ ; <ПОМ>
BR 101436$ ; <ИСП>
BR 101362$ ; <Вверх>
BR 101372$ ; <Вниз>
BR 101436$ ; <Влево>
BR 101436$ ; <Вправо>
101344$:MOV #20,R3 ; Позиционирование курсора
CALL 101564$
EMT 44 ; Вывод краткого хелпинга
.WORD 103406$ ; Адрес начала хелпинга
BR 101224$
101362$:DEC R2 ; Уменьшить номер пункта
BGT 101404$
MOV @R3,R2 ; R2 = номер последнего пункта
BR 101404$
101372$:INC R2 ; Увеличить номер пункта
CMP R2,@R3 ; Превысил номер последнего пункта ?
BLOS 101404$
MOV #1,R2
101404$:MOV R2,@4(R3) ; Запомнить номер текущего пункта
DEC @4(R3)
CLR R0
101416$:TST (R4)+
CLR @#7150 ; Разрешение вывода в верхнюю инф. строку
ASL R2
TST R0
RTS R4
101432$:MOV #10,R0
101436$:SUB #5,R0
101442$:DEC R0
BR 101416$
; П/п вывода пунктов меню
101446$:CLR @#23164 ; Запрет использования курсора
MOV @R4,R2
MOV (R2)+,-(SP) ; Число пунктов меню
MOV (R2)+,R3 ; Координаты курсора
ADD R3,@SP
MOV @(R2)+,-(SP) ; Номер текущего пункта меню
ADD R3,@SP
TST R0
BNE 101502$
CALL 101564$ ; Курсор в начало экрана
EMT 44 ; Стирание правой части экрана
.WORD 103364$
101502$:CALL 101564$
CMP R3,@SP ; Номер выводимого пункта совпадает с текущим ?
BNE 101516$
EMT 44 ; Включить режим инверсии
.WORD 102124$
101516$:MOV (R2)+,R1 ; Вывод очередного пункта
EMT 46
CMP R3,@SP ; Номер выводимого пункта совпадает с текущим ?
BNE 101532$
EMT 44 ; Выключить режим инверсии
.WORD 102127$
101532$:INC R3 ; Переход к очередному пункту
CMP R3,2(SP) ; Вывод завершен ?
BLO 101502$ ; Нет
CMP (SP)+,(SP)+
MOV @R4,R0
MOV @4(R0),R2 ; R2 = номер текущего пункта
INC R2
MOV #2,@#23164 ; Разрешить использование курсора
RETURN
; Следующие две п/п осуществляют позиционирование курсора
; В первой п/п координаты задаются в R3, во второй - в слове,
; которое следует за командой вызова п/п (JSR R4,101616$).
101564$:MOV @#23150,R5 ; R5 = адрес таблицы видеопараметров
MOVB R3,R0 ; R0 = Y (строка)
CALL 115720$ ; Позиционирование по строке
SWAB R3
MOVB R3,R0 ; R0 = X (столбец)
CALL 115672$ ; Позиционирование по столбцу
SWAB R3
INC @#7066 ; Установить признак перемещения курсора
RETURN
101616$:MOV @#23150,R5 ; R5 = адрес таблицы видеопараметров
MOVB (R4)+,R0 ; R0 = Y (строка)
CALL 115720$ ; Позиционирование по строке
MOVB (R4)+,R0 ; R0 = X (столбец)
CALL 115672$ ; Позиционирование по столбцу
INC @#7066 ; Установить признак перемещения курсора
RTS R4
; СПИСКИ ПУНКТОВ МЕНЮ
; Структура списка:
; первое слово - число пунктов меню
; второе слово - координаты курсора
; третье слово - адрес ячейки, в которой сохраняется номер тек. пункта
; далее - адреса надписей пунктов меню
; Список главного меню УСТАНОВКА
101644$:.WORD 10
.BYTE 4,0
.WORD 7152,102165$,102211$,102235$,102261$
.WORD 102305$,102331$,102355$,102401$
; Список меню СИСТЕМА КОМАНД
101672$:.WORD 2
.BYTE 4,30
.WORD 7154,102425$,102445$
; Список меню ФОРМАТ ЭКРАНА
101704$:.WORD 4
.BYTE 4,30
.WORD 7156,102465$,102477$,102511$,102523$
; Список меню ЦВЕТ СИМВОЛА
101722$:.WORD 10
.BYTE 4,30
.WORD 7160,102535$,102562$,102607$,102634$
.WORD 102661$,102706$,102733$,102760$
; Список меню ЦВЕТ ЗНАКОМЕСТА
101750$:.WORD 10
.BYTE 4,30
.WORD 7162,102535$,102562$,102607$,102634$
.WORD 102661$,102706$,102733$,102760$
; Список меню ЦВЕТ ЭКРАНА
101776$:.WORD 10
.BYTE 4,30
.WORD 7164,102535$,102562$,102607$,102634$
.WORD 102661$,102706$,102733$,102760$
; Список меню ЦВЕТ КУРСОРА
102024$:.WORD 10
.BYTE 4,30
.WORD 7166,102535$,102562$,102607$,102634$
.WORD 102661$,102706$,102733$,102760$
; Список меню РУЛОН
102052$:.WORD 3
.BYTE 4,30
.WORD 7170,103005$,103024$,103043$
; Список меню ТАЙМЕР
102066$:.WORD 2
.BYTE 4,30
.WORD 7172,103062$,103077$
; Список меню ЗАГРУЗКА
102100$:.WORD 7
.BYTE 4,2
.WORD 7174,103175$,103216$,103237$,103260$
.WORD 103301$,103322$,103343$
; Esc-последовательность включения инверсии
102124$:.BYTE 33,243,0
; Esc-последовательность выключения инверсии
102127$:.BYTE 33,277,243,0
; Заголовок меню УСТАНОВКА
102133$:.BYTE 14,12,40,33,244
.ASCII /УСТАНОВКА РЕЖИМОВ/
.BYTE 33,277,244,0
; Надписи меню УСТАНОВКА
102165$:.ASCIZ /1 - система команд /
102211$:.ASCIZ /2 - формат экрана /
102235$:.ASCIZ /3 - цвет символа /
102261$:.ASCIZ /4 - цвет знакоместа/
102305$:.ASCIZ /5 - цвет экрана /
102331$:.ASCIZ /6 - цвет курсора /
102355$:.ASCIZ /7 - рулон /
102401$:.ASCIZ /8 - таймер /
; Надписи меню СИСТЕМА КОМАНД
102425$:.ASCIZ /1 - VT-52 /
102445$:.ASCIZ /2 - 15ИЭ-00-013/
; Надписи меню ФОРМАТ ЭКРАНА
102465$:.ASCIZ /1 - 80/<220>/24/
102477$:.ASCIZ /2 - 40/<220>/24/
102511$:.ASCIZ /3 - 20/<220>/24/
102523$:.ASCIZ /4 - 10/<220>/24/
; Надписи меню ЦВЕТ СИМВОЛА, ЦВЕТ ЗНАКОМЕСТА, ЦВЕТ ЭКРАНА, ЦВЕТ КУРСОРА
102535$:.BYTE '1,40,'-,40,33,240,'0,33,241,'0
.BYTE 237,237,237,237,33,277,240,33,277,241,0
102562$:.BYTE '2,40,'-,40,33,240,'1,33,241,'1
.BYTE 237,237,237,237,33,277,240,33,277,241,0
102607$:.BYTE '3,40,'-,40,33,240,'2,33,241,'2
.BYTE 237,237,237,237,33,277,240,33,277,241,0
102634$:.BYTE '4,40,'-,40,33,240,'3,33,241,'3
.BYTE 237,237,237,237,33,277,240,33,277,241,0
102661$:.BYTE '5,40,'-,40,33,240,'4,33,241,'4
.BYTE 237,237,237,237,33,277,240,33,277,241,0
102706$:.BYTE '6,40,'-,40,33,240,'5,33,241,'5
.BYTE 237,237,237,237,33,277,240,33,277,241,0
102733$:.BYTE '7,40,'-,40,33,240,'6,33,241,'6
.BYTE 237,237,237,237,33,277,240,33,277,241,0
102760$:.BYTE '8,40,'-,40,33,240,'7,33,241,'7
.BYTE 237,237,237,237,33,277,240,33,277,241,0
; Надписи меню РУЛОН
103005$:.ASCIZ /1 - плавный /
103024$:.ASCIZ /2 - дискретный/
103043$:.ASCIZ /3 - выключен /
; Надписи меню ТАЙМЕР
103062$:.ASCIZ /1 - включен /
103077$:.ASCIZ /2 - выключен/
; Заголовок меню ЗАГРУЗКА
103114$:.ASCII <33><244>/ЗАГРУЗКА/<33><277><244>
.BYTE 12,12
.REPT 10
.BYTE 31
.ENDR
.ASCII /(0/<221>/3): 0/<12>
.REPT 10
.BYTE 32
.ENDR
.ASCIZ /(1,2): 1/
; Надписи меню ЗАГРУЗКА
103175$:.ASCIZ /1 - диск /
103216$:.ASCIZ /2 - кассета ПЗУ /
103237$:.ASCIZ /3 - сеть /
103260$:.ASCIZ /4 - стык С2 /
103301$:.ASCIZ /5 - магнитофон /
103322$:.ASCIZ /6 - отладка /
103343$:.ASCIZ /7 - тестирование/
; Стирание правой части экрана
103364$:.REPT 10
.BYTE 37,35
.ENDR
.BYTE 37,0
; Краткий хелпинг
103406$:.BYTE 61,221,71,54,200,54,201
.ASCII / - выбор элемента/<15><12>
.BYTE 40,40,203
.ASCII / - следующий уровень/<15><12>
.BYTE 40,40,202
.ASCII / - предыдущий уровень/<15><12>
.ASCIZ /0,/<224>/,ИСП - выход/
.EVEN
Автор: SuperMax 29.1.2021, 1:18
Код
; *********************************************************
; * *
; * ДРАЙВЕР КЛАВИАТУРЫ *
; * *
; * Адреса 103554 - 107743 *
; * *
; *********************************************************
; П/п начальной инициализации
103554$:JSR R5,173730$ ; Очистка ОЗУ
.WORD 7176,1762 ; Начальный адрес - 7176, число слов - 1762
103564$:TST @#177702 ; Сбросить готовность рег.сост. клавиатуры
MOV #175412$,@#300 ; Вектор прерываний от клавиатуры
MOV #200,@#302
MOV #100,@#177700 ; Разрешить прерывания от клавиатуры
MOV #175540$,@#324 ; Вектор прерываний от канала 0 (источник)
MOV #200,@#326
BIS #1,@#177076 ; Разрешить прерывания от канала 0 (источник)
CALL 104064$ ; Настройка начальных адресов буферов
MOV #11140,@#13140 ; Нач. адрес буфера клавиш К1 - К25
MOV #7234,@#7214 ; Текущая таблица - табл. основного регистра
MOV #7234,@#7216
MOVB #40,@#7221 ; Заглавные буквы
MOVB #16,@#7222 ; Латинский регистр
MOVB #17,@#7223
; Заполнение таблиц раскладки клавиатуры
MOV #105520$,R1 ; R1 = нач. адрес данных для таблиц раскладки
MOV #7234,R0 ; R0 = нач. адрес таблиц раскладки
MOV #5,R4 ; R4 = число таблиц раскладки
103720$:MOV #130,R2 ; R2 = число элементов таблицы
MOV R0,R3 ; R3 = адрес текущей заполняемой таблицы
103726$:MOVB (R1)+,(R3)+ ; Пересылка
CLRB (R3)+
SOB R2,103726$
MOV #400,R2 ; R2 = номер первой регистровой клавиши
103740$:MOVB (R1)+,R3
BEQ 103762$ ; Это строка или конец данных для тек. табл.?
BMI 103756$ ; Переход к следующей регистровой комбинации ?
DEC R3 ; Регистровая клавиша (в R3 - смещение)
ASL R3
ADD R0,R3
MOV R2,@R3
103756$:INC R2
BR 103740$
103762$:MOVB (R1)+,R3
BEQ 104004$ ; Это конец таблицы ?
DEC R3 ; Строка (адрес в R1,смещение в табл. в R3)
ASL R3
ADD R0,R3
MOV R1,@R3
103776$:TSTB (R1)+ ; Прогон строки
BNE 103776$
BR 103762$
104004$:ADD #260,R0 ; Переход к следующей таблице
SOB R4,103720$
CALL 113670$ ; Установить систему команд VT-52
MOVB #2,@#7226 ; Интервал автоповтора
RETURN
; П/п ПАУЗА (ожидание нажатия любой клавиши)
104026$:CLR @#177700 ; Запретить прерывания от клавиатуры
104032$:TSTB @#177700 ; Ожидание нажатия или отжатия клавиши
BPL 104032$
TSTB @#177702 ; Клавиша отжата ?
BMI 104032$ ; Да
MOV #100,@#177700 ; Разрешить прерывания от клавиатуры
104054$:JSR R5,173730$ ; Очистка буферов клавиатуры
.WORD 2240,14
; Установка указателей на начало буферов
104064$:MOV #2260,@#7176
MOV #2260,@#7200
MOV #2240,@#7202
MOV #2240,@#7204
MOV #2200,@#7206
MOV #2200,@#7210
RETURN
; П/п обслуживания запросов EMT 22 и EMT 24 (ввод символа с ожиданием)
104132$:TRAP 2 ; Считывание символа с буфера в регистр R0
ADD @#7230,PC ; Символ есть в буфере ?
BR 104152$ ; Да
CLR @#7230
TRAP 0 ; Запуск диспетчера процессов
BR 104132$
104152$:MOV R0,2(SP)
RETURN
; П/п заноса ASCII-символов и адресов строк в буфер
104160$:MOV R0,@7210 ; Занести символ в буфер
ADD #2,@#7210 ; Продвинуть указатель
BIC #40,@#7210 ; Корректировка указателя (циклический буфер)
ADD @#7230,PC
RETURN
104206$:TRAP 2
RETURN
; *** ОСНОВНАЯ П/П ОБСЛУЖИВАНИЯ КЛАВИАТУРЫ ***
; Точка выхода из п/п обслуживания клавиатуры
104212$:CLR @#7060 ; Очистить флаг вызова п/п
CLRB @#7227 ; Очистить ячейку значения автоповтора
104222$:ADD @#7230,PC
RETURN
104230$:TRAP 2
RETURN
104234$:TSTB @7202 ; Есть скэн-коды в буфере автоповтора ?
BEQ 104212$ ; Нет
TSTB @#7227 ; Истекло время автоповтора ?
BNE 104222$ ; Нет
MOV @#7202,R3 ; R3 = указатель на буфер автоповтора(чтение)
104254$:MOVB (R3)+,R0 ; Прочесть очередной скэн-код
BNE 104336$ ; Он существует
104260$:BIC #20,R3 ; Подправить значение указателя
CMP R3,@#7204 ; Буфер просмотрен до конца ?
BNE 104254$ ; Нет
MOVB @#7226,@#7227
DEC @#7060
BR 104222$
; Точка входа в п/п обслуживания клавиатуры из диспетчера процессов
104306$:MOV @#7176,R1 ; R1 = указатель на буфер скэн-кодов
MOVB @R1,R0 ; Прочесть скэн-код
BEQ 104234$ ; Скэн-кода нет
DEC @#7060 ; Уменьшить счетчик (флаг вызова)
CLRB (R1)+ ; Вычеркнуть скэн-код из буфера
BIC #10,R1 ; Подправить значение указателя
MOV R1,@#7176
CLR R3 ; В данном случае R3 является индикатором
; того, что скэн-код был прочитан из основ-
; ного буфера (R3=0) или из буфера авто-
; повтора (R3<>0).
104336$:MOV R0,R2 ; R2 = скэн-код
BMI 104516$ ; Это скэн-код отжатия
ASHC #74,R0 ; Извлечение ASCII-кода
MOVB 105510$(R0),R1
MOV R2,R0
SUB R1,R0
ASL R0
ADD @#7214,R0
MOV @R0,R0
MOV R0,R1
SWAB R1
BEQ 104410$ ; Это одиночный ASCII-код
ASRB R1
BNE 104434$ ; Это адрес ASCIZ-строки
MOVB R0,R0 ; Переход на обслуживание регистровых клавиш
ASL R0
JMP @104714$(R0)
104410$:TST @#7232 ; Разрешена передача одиночных символов ?
BNE 104510$ ; Нет
TSTB R0 ; Символ в диапазоне 128-255 ?
BMI 104434$ ; Да
CMP R0,#100 ; Это символы @,A-Z,[,\,],_ ?
BLO 104434$ ; Нет
BISB @#7220,R0 ; Установка заглавные/строчные буквы
104434$:TST R3 ; Это символ из буфера автоповтора ?
BNE 104472$ ; Да
TSTB @7202 ; Буфер автоповтора пуст ?
BNE 104454$ ; Нет
MOVB #31,@#7227 ; Задать время между нажатием и автоповтором
104454$:MOVB R2,@7204 ; Положить скэн-код в буфер автоповтора
INC @#7204 ; Подправить значение указателя
BIC #20,@#7204
104472$:MOV @#7210,R1 ; R1 = указатель на буфер ASCII-символов
MOV R0,(R1)+ ; Положить символ(адрес строки) в буфер
BIC #40,R1
MOV R1,@#7210
104510$:TST R3 ; Это был символ из буфера автоповтора ?
BNE 104260$ ; Да
104514$:BR 104306$
104516$:MOV @#7212,R0 ; R0 = ожидаемый код отжатия рег. клавиши
BEQ 104614$ ; Регистровая клавиша не была нажата
CMPB R2,R0 ; Коды отжатия совпадают ?
BEQ 104540$ ; Да
104530$:SWAB R0
BEQ 104530$
CMPB R2,R0
BNE 104614$
; Обработка кода отжатия регистровой клавиши
104540$:CLRB R0 ; Очистить байт кода отжатия
SWAB R0
MOV R0,@#7212
CLR R0
CMPB R2,#205 ; Была отжата клавиша НР (Shift) ?
BEQ 104574$ ; Да
MOVB @#7224,R0 ; R0 = ASCII-код, посылаемый при отжатии АЛФ
BEQ 104600$ ; Его нет
CLRB @#7224
BR 104600$
104574$:SWAB @#7220 ; Переменить состояние заглавные/строчные
104600$:MOV @#7216,@#7214 ; Восстановить пред. табл. раскл. клавиатуры
TST R0 ; Есть данные для передачи при отжатии АЛФ ?
BNE 104472$ ; Да
BR 104306$
; Обработка кода отжатия алфавитно-цифровой клавиши
104614$:BIC #177760,R2 ; Оставить биты кода отжатия
MOV @#7202,R1 ; R1 = указатель на буфер автоповтора
104624$:MOVB (R1)+,R0 ; Прочесть скэн-код из буфера автоповтора
BEQ 104644$ ; Он отсутствует
BIC #177760,R0 ; Оставить биты кода отжатия
CMP R0,R2 ; Эти коды совпадают ?
BEQ 104700$ ; Да
MOV R2,R3
BEQ 104306$
104644$:BIC #20,R1
TST R3
BNE 104660$
MOV R1,@#7202
104660$:CMP R1,@#7204 ; Буфер просмотрен до конца ?
BNE 104624$ ; Нет
MOVB #2,@#7226 ; Установить нормальную скорость автоповтора
104674$:JMP 104306$
104700$:CLRB -1(R1) ; Выбросить скэн-код из буфера автоповтора
CLR R2 ; R2 = 0(признак того, что скэн-код обнаружен)
TST R3
BNE 104674$
BR 104644$
; Адреса п/п обслуживания регистровых комбинаций
104714$:.WORD 104766$ ; Нажатие НР (Shift)
.WORD 105044$ ; Нажатие АЛФ
.WORD 105116$ ; Нажатие ГРАФ (Graph)
.WORD 105150$ ; Нажатие УПР (Ctrl)
.WORD 105160$ ; Нажатие ФИКС (Lock)
.WORD 104734$ ; Установка режимов (УСТ)
.WORD 105234$ ; Режим ИСУ (УПР+ПОМ)
.WORD 104746$ ; Печать экрана (УПР+ИСП)
; П/п обслуживания нажатия УСТ
104734$:CLR @#7042 ; Адресовать ASCII-коды клавиатуры запросу EMT
INC @#7070 ; Установить флаг вызова меню УСТАНОВКА
BR 104514$
; П/п обслуживания нажатия УПР+ИСП (печать экрана)
104746$:CALL 135704$ ; Печать экрана
MOV @#7216,@#7214
CLR @#7212
BR 104514$
; П/п обслуживания нажатия НР
104766$:TSTB @7202 ; Нажата какая-нибудь алф.-циф. клавиша ?
BEQ 105004$ ; Нет
MOV #401,7226 ; Установить повышенную скорость автоповтора
BR 104514$
105004$:MOV #205,R1 ; R1 = код отжатия НР
MOV #7514,@#7214 ; Текущая табл.-таблица нижнего регистра
105016$:SWAB @#7220 ; Переключить режим заглавные/строчные буквы
105022$:SWAB @#7212
MOVB R1,@#7212
CMPB @#7213,#207 ; Была нажата клавиша ФИКС ?
BEQ 105202$ ; Да
BR 104514$
; П/п обслуживания нажатия АЛФ
105044$:MOVB @#7222,R0 ; R0 = 16(8) или 17(8)
MOVB @#7223,@#7224
SWAB @#7212
MOVB #206,@#7212 ; Код отжатия клавиши АЛФ
CMPB @#7213,#207 ; Была нажата клавиша ФИКС ?
BNE 105112$ ; Нет
CLRB @#7224 ; При отжатии АЛФ не передавать ASCII-кода
MOV @#7216,@#7214
105112$:JMP 104472$
; П/п обслуживания нажатия ГРАФ
105116$:MOV #7774,@#7214 ; Текущая табл.-таблица ГРАФ-регистра
105124$:MOV #206,R1 ; R1 = код отжатия ГРАФ и УПР
105130$:CMP @#7214,@#7216 ; Адрес текущей табл. равен адресу предыдущей ?
BNE 105022$ ; Нет
MOV #7234,@#7214 ; Текущая таблица-таблица основного регистра
BR 105022$
; П/п обслуживания нажатия УПР
105150$:MOV #10254,@#7214 ; Текущая таблица-таблица УПР-регистра
BR 105124$
; П/п обслуживания нажатия ФИКС
105160$:MOV #207,R1 ; R1 = код отжатия ФИКС
TST @#7212 ; Нажата регистровая клавиша ?
BNE 105202$ ; Да
MOV #10534,@#7214 ; Текущая таблица-таблица ФИКС-регистра
BR 105130$
105202$:CMP @#7214,#7514 ; Нажата НР ?
BEQ 105016$ ; Да
TSTB @#7224 ; Нажата АЛФ ?
BEQ 105224$ ; Нет
CLRB @#7224 ; При отжатии АЛФ не передавать ASCII-кода
105224$:MOV @#7214,@#7216
BR 105022$
; П/п обслуживания нажатия УПР+ПОМ (ИСУ on/off)
105234$:COMB @#22552 ; Изменить режим ИСУ/не ИСУ
BEQ 105250$ ; Режим ИСУ выключен
EMT 52 ; Высветить надпись "ИСУ"
.WORD 107641$
BR 105254$
105250$:EMT 52 ; Стереть надпись "ИСУ"
.WORD 107632$
105254$:JMP 104306$
; П/п обработки управляющего символа Ctrl+N (переключение на русский алфавит)
105260$:MOV @#22556,R0 ; R0 = текущее состояние алфавита
MOV #200,@#22556 ; Установить русский алфавит
MOV #16*400+17,@#7222;Последовательность посылки кодов
; при нажатии и отжатии АЛФ
EMT 52 ; Высветить надпись "РУС"
.WORD 107731$
BR 105330$
; П/п обработки управляющего символа Ctrl+O (переключение на латинский алфавит)
105306$:MOV @#22556,R0
CLR @#22556 ; Установить латинский алфавит
MOV #17*400+16,@#7222
EMT 52 ; Высветить надпись "ЛАТ"
.WORD 107736$
105330$:CMP R0,@#22556 ; Предыдущий и текущий режимы алфавита равны ?
BEQ 105342$ ; Да
SWAB @#7220 ; Переменить верхний/нижний регистр
105342$:RETURN
105344$:RETURN
; П/п устанавливает специальные режимы клавиатуры (системный, ДКЛ)
105346$:MOV (R5)+,R0 ; R0 = адрес новых кодов клавиатуры
MOV (R5)+,R1 ; R1 = адрес буфера сохранения
TST @R1 ; Режим уже был установлен ?
BNE 105376$ ; Да
INC (R1)+ ; Установить флаг спецрежима
BR 105372$
105362$:MOV 7232(R2),(R1)+ ; Сохранить значение клавиши
MOV (R0)+,7232(R2) ; Занести новое значение
105372$:MOV (R0)+,R2 ; R2 = адрес клавиши
BNE 105362$ ; Еще не конец таблицы
105376$:RTS R5
; П/п восстанавливает предыдущий режим клавиатуры
105400$:MOV (R5)+,R0 ; R0 = адрес новых кодов клавиатуры
MOV (R5)+,R1 ; R1 = адрес буфера сохранения
TST @R1 ; Спецрежим установлен ?
BEQ 105426$ ; Нет
CLR (R1)+ ; Сбросить флаг спецрежима
BR 105422$
105414$:MOV (R1)+,7232(R2) ; Восстановить значение клавиши
TST (R0)+
105422$:MOV (R0)+,R2 ; R2 = адрес клавиши
BNE 105414$ ; Еще не конец таблицы
105426$:RTS R5
; П/п переключения клавиатуры в новый режим. Если текущий режим является
; не системным, то переключение производится сразу, иначе (системный режим)
; производится проверка адресов клавиш и для клавиш, задействованных
; в системном режиме, информация сохраняется в буфере, откуда перекачивается
; в таблицу раскладки при выходе из системного режима.
105430$:MOV (R5)+,R0 ; R0 = адрес новой таблицы
BR 105502$
105434$:TST @#11054 ; Установлен системный режим ?
BEQ 105476$ ; Нет
MOV #107310$-4,R2 ; R2 = адрес списка системных клавиш
105446$:ADD #4,R2 ; Перейти к следущему адресу
MOV @R2,R3 ; R3 = адрес клавиши
BEQ 105476$ ; Конец списка системных клавиш
CMP R3,R1 ; Адреса совпадают ?
BNE 105446$ ; Нет
SUB #107310$,R2 ; Получение адреса клавиши в буфере сохранения
ASR R2
MOV (R0)+,11056(R2); Занести код в буфер сохранения
BR 105502$
105476$:MOV (R0)+,7232(R1) ; Занести код в таблицу раскладки клавиатуры
105502$:MOV (R0)+,R1 ; R1 = адрес клавиши
BNE 105434$ ; Еще не конец таблицы
RTS R5
; Корректирующие коды, использующиеся при вычислении адреса в таблице раскладки
105510$:.BYTE 5,12,17,24,31,36,43,50
; НАЧАЛЬНЫЕ ДАННЫЕ ДЛЯ ТАБЛИЦ РАСКЛАДКИ КЛАВИАТУРЫ
; Структура :
; первые 88 байт - ASCII-коды для клавиш
; далее - смещения для регистровых клавиш (конец - байт 0)
; строки символов : - смещение в таблице (байт 0 - конец списка)
; - ASCIZ-строка
; байт 0 - конец описания раскладки
; Раскладка основного регистра
105520$:.BYTE 54,33,73,0,0,0,64,0,0,67,70,55,11,112,61,62,63,105,65,66
.BYTE 133,135,0,0,106,103,125,113,120,116,107,114,104,0,0,121
.BYTE 131,127,101,111,122,117,102,100,0,0,0,136,123,115,40,124
.BYTE 130,0,54,67,60,61,64,53,177,0,0,56,134,126,70,56,62,65,0
.BYTE 0,15,0,137,110,132,71,15,63,66,14,12,57,72,55,60,71
; - список регистровых клавиш
.BYTE 55,56,43,30,57,110,0
; - строки символов
.BYTE 107
.ASCIZ <33><177>
.BYTE 123
.ASCIZ <33>/~/
.BYTE 4,0,5,0,6,0,10,0,11,0,0
; Раскладка НР-регистра
105702$:.BYTE 54,33,53,0,0,0,44,0,0,47,50,57,11,112,41,42,43,105,45,46
.BYTE 133,135,0,0,106,103,125,113,120,116,107,114,104,0,0,121
.BYTE 131,127,101,111,122,117,102,100,0,0,0,136,123,115,40,124
.BYTE 130,0,74,67,60,61,64,52,177,0,0,76,134,126,70,56,62,65,0
.BYTE 0,12,0,137,110,132,71,15,63,66,14,12,77,52,75,60,51
; - список регистровых клавиш
.BYTE 55,56,43,30,57,110,0
; - строки символов
.BYTE 107
.ASCIZ <33><177>
.BYTE 123
.ASCIZ <33>/~/
.BYTE 4,0,5,0,6,0,10,0,11,0,0
; Раскладка ГРАФ-регистра
106064$:.BYTE 54,33,73,0,0,0,64,0,0,67,70,55,11,252,61,62,63,245,65,66
.BYTE 273,275,0,0,246,243,265,253,260,256,247,254,244,0,0,261
.BYTE 271,267,241,251,262,257,242,240,0,0,0,276,263,255,40,264
.BYTE 270,0,54,67,60,61,64,53,177,0,0,56,274,266,70,56,62,65,0
.BYTE 0,0,0,277,250,272,71,15,63,66,14,12,57,72,55,60,71
; - список регистровых клавиш
.BYTE 55,56,43,30,57,110,0
; - строки символов
.BYTE 66
.ASCIZ <33>/D/
.BYTE 76
.ASCIZ <33>/C/
.BYTE 112
.ASCIZ <33>/A/
.BYTE 77
.ASCIZ <33>/B/
.BYTE 111
.ASCIZ <15><12>
.BYTE 4,0,5,0,6,0,10,0,11,0,0
; Раскладка УПР-регистра
106262$:.BYTE 0,33,73,0,0,0,64,0,0,67,70,0,11,12,61,62,63,5,65,66,33,35
.BYTE 0,0,6,3,25,13,20,16,7,14,4,0,0,21,31,27,1,11,22,17,2,0,0,0,0
.BYTE 36,23,15,40,24,30,0,54,67,60,61,64,0,177,0,0,56,34,26,70,56
.BYTE 62,65,0,0,0,0,37,10,32,71,15,63,66,14,12,57,72,55,60,71
; - список регистровых клавиш
.BYTE 55,56,43,30,57,110,123,107,0
; - строки символов
.BYTE 74
.ASCIZ <33>/P/
.BYTE 14
.ASCIZ <33>/Q/
.BYTE 1
.ASCIZ <33>/R/
.BYTE 4,0,5,0,6,0,10,0,11,0,0
; Раскладка ФИКС-регистра
106452$:.BYTE 54,33,73,0,0,0,64,0,0,67,70,55,11,112,61,62,63,105,65,66
.BYTE 133,135,0,0,106,103,125,113,120,116,107,114,104,0,0,121
.BYTE 131,127,101,111,122,117,102,100,0,0,0,136,123,115,40,124
.BYTE 130,0,54,67,60,61,64,53,177,0,0,56,134,126,70,56,62,65,0
.BYTE 0,0,0,137,110,132,71,15,63,66,14,12,57,72,55,60,71
; - список регистровых клавиш
.BYTE 55,56,43,30,57,110,0
; - строки символов
.BYTE 107
.ASCIZ <33><177>
.BYTE 123
.ASCIZ <33>/~/
.BYTE 4,0,5,0,6,0,10,0,11,0,0
; Данные для пользовательского режима (VT-52)
106634$:.WORD 224,106752$,176,106755$,154,106760$,174,106763$
.WORD 504,106752$,456,106755$,434,106760$,454,106763$
.WORD 1244,106752$,1216,106771$,1174,106760$,1214,106766$
.WORD 1524,106752$,1476,106755$,1454,106760$,1474,106763$
.WORD 244,106774$,524,106771$,1242,106777$,0
106752$:.ASCIZ <33>/A/
106755$:.ASCIZ <33>/B/
106760$:.ASCIZ <33>/D/
106763$:.ASCIZ <33>/C/
106766$:.ASCIZ <33>/K/
106771$:.ASCIZ <33>/J/
106774$:.ASCIZ <33>/H/
106777$:.ASCIZ <15><12>
; Данные для пользовательского режима (15ИЭ-00-013)
107002$:.WORD 224,34,176,35,154,32,174,31,504,22,456,26,434,24,454,23
.WORD 1244,34,1216,37,1174,32,1214,13,1524,34,1476,35,1454,32,1474,31
.WORD 244,10,524,14,1242,25,0
; Данные для ДКЛ-режима
107120$:.WORD 236,107216$,210,107222$,162,107226$,164,107232$
.WORD 212,107236$,240,107242$,166,107246$,214,107252$
.WORD 242,107256$,160,107262$,206,107266$,234,107272$
.WORD 170,107276$,30,107301$,2,107304$,0
107216$:.ASCIZ <33>/?M/
107222$:.ASCIZ <33>/?n/
107226$:.ASCIZ <33>/?p/
107232$:.ASCIZ <33>/?q/
107236$:.ASCIZ <33>/?r/
107242$:.ASCIZ <33>/?s/
107246$:.ASCIZ <33>/?t/
107252$:.ASCIZ <33>/?u/
107256$:.ASCIZ <33>/?v/
107262$:.ASCIZ <33>/?w/
107266$:.ASCIZ <33>/?x/
107272$:.ASCIZ <33>/?y/
107276$:.ASCIZ <33>/P/
107301$:.ASCIZ <33>/Q/
107304$:.ASCIZ <33>/R/
.EVEN
; Данные для системного режима
107310$:.WORD 162,60,164,61,212,62,240,63,166,64
.WORD 214,65,242,66,160,67,206,70,234,71
.WORD 222,107462$,236,107464$,246,107466$,216,107471$
.WORD 224,107474$,176,107477$,154,107502$,174,107505$
.WORD 504,107510$,456,107513$,434,107516$,454,107521$
.WORD 146,107460$,172,107456$,244,14,0
107456$:.BYTE 177,0
107460$:.BYTE 40,0
107462$:.BYTE 15,0
107464$:.BYTE 15,0
107466$:.ASCIZ <33>/~/
107471$:.ASCIZ <33><177>
107474$:.ASCIZ <33><200>
107477$:.ASCIZ <33><201>
107502$:.ASCIZ <33><202>
107505$:.ASCIZ <33><203>
107510$:.ASCIZ <33><204>
107513$:.ASCIZ <33><205>
107516$:.ASCIZ <33><206>
107521$:.ASCIZ <33><207>
; Надписи для верхней информационной строки
107524$:.ASCIZ <0>/ /
107533$:.ASCIZ <0>/ УСТ/
107542$:.ASCIZ <5>/ /
107551$:.ASCIZ <5>/ ПМ /
107560$:.ASCIZ <5>/ ЦМ /
107567$:.ASCIZ <12>/ /
107576$:.ASCIZ <12>/ ДКЛ /
107605$:.ASCIZ <17>/ /
107614$:.ASCIZ <17>/ ИНВ /
107623$:.ASCIZ <17>/ПОДЧ /
107632$:.ASCIZ <24>/ /
107641$:.ASCIZ <24>/ ИСУ /
107650$:.ASCIZ <31>/ /
107657$:.ASCIZ <31>/ НР /
107666$:.ASCIZ <31>/ СУ /
107675$:.ASCIZ <31>/ГРАФ /
107704$:.ASCIZ <31>/ФИКС /
107713$:.ASCIZ <36>/ЗАГЛ /
107722$:.ASCIZ <36>/СТР /
107731$:.ASCIZ <43>/РУС/
107736$:.ASCIZ <43>/ЛАТ/
.EVEN
Автор: SuperMax 29.1.2021, 1:19
Код
; *****************************************************************
; * *
; * ДРАЙВЕР ТЕКСТОВОГО ТЕРМИНАЛА *
; * *
; * Адреса 107744 - 125027 *
; * *
; *****************************************************************
; П/п начальной инициализации
107744$:JSR R5,173730$ ; Очистка ОЗУ
.WORD 13142,4017 ; Начальный адрес - 13142, число слов - 4017
107754$:MOV #0,@#177026 ; Разрешить все планы видеопамяти
CLR @#177020 ; Очистка регистров цвета кода фона
CLR @#177022
CLR R0 ; Цикл очистки видеопамяти
MOV #177010,R1
MOV #100000,@R1
MOV #100000,R2
MOV #177024,R3
110014$:MOV R0,@R3
INC @R1
SOB R2,110014$
MOV #175700$,@#320 ; Адрес п/п обработки прерывания канала 0,пр.
MOV #200,@#322
BIS #1,@#177066 ; Разрешить прерывания канала 0, приемник
CALL 110266$ ; Запрограммировать таблицу видеострок
MOV #117430$-13,R0 ; Настройка таблицы адресов рисунков символов
MOV #14142,R1 ; на область ПЗУ (адреса 117430-125027)
MOV #400,R2
MOV #13,R3
110070$:ADD R3,R0
MOV R0,(R1)+
SOB R2,110070$
MOV #112462$,R0 ; Настройка таблицы адресов п/п управляющих и
BR 110110$ ; Esc-последовательностей
110104$:MOV (R0)+,13142(R1)
110110$:MOV (R0)+,R1
BNE 110104$
MOV #2000,@#22542 ; Настройка указателей на буферы
MOV #2000,@#22544
MOVB #14,@#2000 ; Положить символ Ctrl+L в буфер (CLS)
JSR R5,110656$ ; Загрузка в ОЗУ ТВ для верхней строки
.WORD 112040$,22560
JSR R5,110656$ ; Загрузка в ОЗУ ТВ для экрана пользователя
.WORD 112142$,22656
JSR R5,110656$ ; Загрузка в ОЗУ ТВ для экрана установки
.WORD 112252$,22754
JSR R5,110656$ ; Загрузка в ОЗУ ТВ для нижней строки
.WORD 112360$,23052
MOV #2270,@#272 ; Настройка первой видеостроки
110204$:MOV #22656,R5 ; R5 = адрес ТВ для экрана пользователя
110210$:MOV 62(R5),@#23160 ; Указатель на регистр управления отображением
; экраном пользователя
MOV 72(R5),@#23164 ; Режим использования курсора
INC @#7066 ; Увел. счетчик симв. в буфере (для вывода CLS)
110230$:MOV R5,@#23150 ; Сделать текущей ТВ, адрес которой в R5
MOV 34(R5),@#177016; Настройка регистра кода цвета точки
MOV 40(R5),@#177020; Настройка регистра кода цвета фона
MOV 40(R5),@#177022
MOVB 70(R5),@64(R5) ; Установить цвет курсора
RETURN
; П/п программирования таблицы видеострок
110266$:MOV #1131,R2 ; Число программируемых видеострок (ВС)
MOV #7034,R1 ; Адрес конца
MOV R1,@#7036
110302$:MOV R1,R0 ; Цикл начального заполнения таблицы
MOV R0,-(R1)
TST -(R1)
SOB R2,110302$
JSR R5,110550$ ; Заполнение зоны адресов для ВС вехней строки
.WORD 175700,2410,12,50
MOV R0,@#2464
MOV #177460,@#2474
JSR R5,110550$ ; Заполнение зоны адресов для ВС польз. экрана
.WORD 100000,2500,436,120
MOV #177460,@#4674
JSR R5,110550$ ; Заполнение зоны адресов для ВС УСТ экрана
.WORD 177460,4704,25,0
JSR R5,110550$
.WORD 154540,5030,334,50
JSR R5,110550$
.WORD 177460,6610,26,0
MOV #177460,@#6744
JSR R5,110550$ ; Заполнение зоны адресов для ВС нижней строки
.WORD 176570,6754,13,50
JSR R5,110550$
.WORD 177460,7030,2,0
MOV #2,R0 ; Выделение регистров управления отображением,
MOV #6,R1 ; цветом и подправка структуры таблицы
BIS R0,@#2366
BIS R1,@#2376
BIS R0,@#2456
BIS R1,@#2466
MOV #2500,@#4666
BIS R1,@#4676
MOV #6742,@#4536
MOV #6742,@#6736
BIS R1,@#6746
RETURN
; П/п заполнения зоны адресов для ВС
; 1 параметр - начальный видеоадрес
; 2 параметр - начальный адрес таблицы ВС
; 3 параметр - размер таблицы (число видеострок)
; 4 параметр - длина видеостроки
110550$:MOV (R5)+,R0
MOV (R5)+,R1
MOV (R5)+,R2
MOV (R5)+,R3
110560$:MOV R0,(R1)+
ADD R3,R0
TST (R1)+
SOB R2,110560$
RTS R5
; П/п установки таблицы ВС на начало видеопамяти
110572$:ADD 74(R5),PC ; Рулон присутствует ?
BR 110654$ ; Нет
CLR @#23170 ; Число строк для скроллинга = 0
MOV @#2476,R0 ; Корректировка таблицы
ADD #2040,R0
CMP R0,#4670
BLOS 110626$
SUB #2170,R0
110626$:MOV R0,-2(R0)
MOV #6742,@#4536 ; Установка начальных значений
MOV #2500,@#2476
MOV #2500,30(R5)
110654$:RETURN
; П/п формирования таблицы видеопараметров
110656$:MOV (R5)+,R0 ; R0 = адрес таблицы в ПЗУ
MOV @R5,R1 ; R1 = адрес таблицы в ОЗУ
JSR R5,110716$ ; Перекачка таблицы в ОЗУ
MOV (R5)+,R1
MOV (R0)+,@64(R1) ; Заполнение регистра управления отображением
MOV (R0)+,@54(R1)
MOV (R0)+,@50(R1) ; Заполнение регистра управления цветом
MOV (R0)+,@52(R1)
RTS R5
; П/п перекачки
110712$:MOV (R5)+,R0
MOV (R5)+,R1
110716$:MOV (R0)+,R2 ; R2 = число слов
110720$:MOV (R0)+,(R1)+
SOB R2,110720$
RTS R5
; *** ОСНОВНАЯ ПОДПРОГРАММА УПРАВЛЕНИЯ ТЕКСТОВЫМ ТЕРМИНАЛОМ ***
110726$:MOV #174164$,-(SP) ; Занести в стек адреса возвратов
MOV #111126$,-(SP)
MOV SP,@#23152
MOV @#23154,SP
MOV @#23150,R5 ; R5 = адрес текущей ТВ
INC @#7066 ; Установить флаг вызова п/п перекл. курсора
110756$:INC @#7064
; П/п чтения очередного символа, посланного по каналу 0
110762$:DEC @#7064 ; Уменьшить счетчик символов
BEQ 111050$ ; Символов нет
MOVB @22542,R0 ; Прочесть символ
INC @#22542 ; Подкорректировать указатель
BIC #200,@#22542
BIC #177400,R0
CMP R0,#40 ; Это управляющие коды ?
BHIS 111024$ ; Нет
ADD @#23174,PC ; Разрешено чтение управляющих символов ?
111024$:RETURN ; Да
111026$:CMP R0,#33 ; Это символ Esc ?
BEQ 111044$ ; Да
ASL R0 ; Вызов п/п обработки управляющего символа
CALL @13142(R0)
BR 110762$
111044$:JMP 113544$
111050$:ADD @#22546,PC ; Была попытка передачи символа ?
BR 111062$ ; Нет
TRAP 4
BR 110756$
111062$:MOV @#7056,R0 ; R0 = указатель текущей задачи
MOV #110726$,22(R0); Запомнить адрес возврата
MOV SP,@#23154
MOV @#23152,SP
CMP (SP)+,(SP)+
JMP 174164$ ; Переход на цикл вызова подпрограмм
111112$:ADD @#22546,PC ; Была попытка передачи символа ?
RETURN ; Нет
TRAP 4
INC @#7064
111126$:DEC @#7064 ; Уменьшить счетчик символов
BEQ 111112$ ; Символов нет
TST @#7060 ; Были нажаты клавиши ?
BEQ 111204$ ; Нет
RETURN
; Точка входа в подпрограмму
111144$:INC @#7066 ; Установить флаг вызова п/п перекл. курсора
MOV @#23150,R5 ; R5 = адрес текущей таблицы видеопараметров
MOV 34(R5),@#177016; Загрузка регистров кода цвета и кода фона
MOV 40(R5),@#177020
MOV 40(R5),@#177022
MOVB 70(R5),@64(R5) ; Установить цвет курсора
111204$:MOVB @22542,R0 ; Прочесть символ
INC @#22542 ; Подкорректировать указатель
BIC #200,@#22542
MOV #111126$,-(SP) ; Положить в стек адрес возврата
BIC #177400,R0
CMP R0,#40 ; Это управляющие коды ?
BHIS 111260$ ; Нет
TSTB @#22552 ; Установлен режим ИСУ ?
BEQ 111252$ ; Нет
JMP 111730$
111252$:ASL R0 ; Вызов п/п обработки управляющего символа
JMP @13142(R0)
111260$:CMPB R0,#77 ; Это символы "A-Z,[,\,],^,_,a-z,{,|,},~" ?
BLOS 111272$ ; Нет
BIS @#22556,R0 ; Подстройка алфавита
111272$:ASL R0
MOV 14142(R0),R1 ; R1 = адрес рисунка символа
MOV 10(R5),R0 ; R0 = длина видеостроки
MOV #177010,R2
MOV #177024,R3
MOV @R5,@R2 ; Уст. в регистре адреса планов нач. адрес
ADD 56(R5),PC ; Переход в зависимости от режима (инверсия...)
111322$:.REPT 12 ; Цикл рисования символа
MOVB (R1)+,R4
MOV R4,@R3
ADD R0,@R2
.ENDR
MOVB (R1)+,R4
MOV R4,@R3
111422$:INC @R5 ; Передвинуть указатель на следующий адрес
DEC 16(R5) ; Уменьшить счетчик оставшихся позиций
BNE 111624$ ; Еще не конец строки
MOV 22(R5),@R5 ; Формирование адреса начала следующей строки
MOV 4(R5),16(R5)
111444$:ADD #54,32(R5)
CMP 32(R5),26(R5)
BNE 111470$
MOV 24(R5),32(R5)
111470$:ADD @32(R5),@R5
DEC 20(R5) ; Уменьшить счетчик оставшихся строк
BNE 111624$ ; Еще не конец экрана
ADD 74(R5),PC ; Рулон присутствует ?
BR 111626$ ; Нет
INC 20(R5) ; Увеличить счетчик оставшихся строк
MOV #13,-(SP)
ADD #54,30(R5) ; Увелич. адрес списка ВС верхней части экрана
CMP 30(R5),#4670
BNE 111544$
MOV #2500,30(R5)
111544$:MOV @#23170,R0 ; R0 = кол-во оставшихся видеострок для скрол.
BEQ 111574$ ; Их нет
BPL 111556$
NEG R0
111556$:CMP R0,#14 ; <= 12(10) ?
BLOS 111614$ ; Да
TRAP 0 ; Вызов цикла подпрограмм
MOV @#23150,R5 ; R5 = адрес текущей ТВ
BR 111544$
111574$:CLR @#23164 ; Запретить курсор
MOV #2,@#7134
MOVB #177,@23160 ; Убрать курсор с экрана
111614$:CALL 113344$ ; Очистить освободившуюся строку
ADD (SP)+,@#23170 ; Осуществить скроллинг
111624$:RETURN
111626$:JMP 114316$ ; Перекинуть курсор на верх экрана
; П/п выключения курсора
111632$:CLR @#23164 ; Запретить использование курсора
MOV 60(R5),R0 ; Выключение курсора
BIC #1,6(R0)
BIC #1,52(R0)
RETURN
; Обработка режима ПОДЧЕРКИВАНИЕ
111660$:MOV #12,R0 ; R0 = число байт для посылки в видео
111664$:MOVB (R1)+,R4 ; Рисование символа
MOV R4,@R3
ADD 10(R5),@R2
SOB R0,111664$
MOV #377,@R3 ; Подчеркнуть символ
BR 111422$
; Обработка режима ИНВЕРСИЯ
111704$:MOV #13,R0
BR 111716$
111712$:ADD 10(R5),@R2
111716$:MOVB (R1)+,R4
COM R4 ; Инвертировать байт
MOV R4,@R3
SOB R0,111712$
BR 111422$
; Обработка режима ИСУ
111730$:MOV #3,-(SP) ; Формирование начальных значений
MOV R0,-(SP)
MOV R0,-(SP)
MOV #74,R0 ; Вывод "<"
CALL 111272$
CLR R0 ; Цикл вывода трех цифр
BR 111762$
111754$:CLR R0
ROLB @SP
ROLB R0
111762$:ROLB @SP
ROLB R0
ROLB @SP
ROLB R0
ADD #60,R0
CALL 111272$
DEC 4(SP)
BNE 111754$
MOV #76,R0 ; Вывод ">"
CALL 111272$
TST (SP)+
CMP #12,(SP)+ ; Это был символ LF ?
BNE 112034$ ; Нет
CALL 114310$ ; Вывод CRLF
112034$:TST (SP)+
RETURN
; ТАБЛИЦЫ ВИДЕОПАРАМЕТРОВ
; Структура таблицы:
; - первое слово N - число элемнтов в таблице
; - N слов - содержимое таблицы
; - 4 слова - значения регистров управления отображением и цветом
; ТВ для верхней информационной строки
112040$:.WORD 34
.WORD 175700,175700,50,13,50,1,13,50,1,0,2410,12114,2410,2410
.WORD 6,6,0,0,0,0,2400,2402,2372,0,2410,2371,2370,2
.WORD 0,27,21000,63104
; ТВ для пользовательского экрана
112142$:.WORD 37
.WORD 100000,100000,120,410,120,30,436,120,30,0,2500,4670,2500,2500
.WORD 7,7,10421,10421,10421,10421,2470,2472,2462,0,2500,2461,2460
.WORD 1,7,2,2
.WORD 7,7,135230,177334
; ТВ для экрана установки
112252$:.WORD 36
.WORD 154540,154540,50,334,50,24,334,50,24,0,5030,6610,5030,5030
.WORD 7,7,10421,10421,10421,10421,4700,4702,4672,0,5030,4671,4670
.WORD 2,7,2
.WORD 7,27,135230,177334
; ТВ для нижней информационной строки
112360$:.WORD 34
.WORD 176570,176570,50,13,50,1,13,50,1,0,6754,7030,6754,6754
.WORD 6,6,0,0,0,0,6750,6752,6742,0,6754,6741,6740,2
.WORD 0,27,21000,63104
; Таблица описания адресов п/п исполнения управляющих и Esc-последовательностей
112462$:.WORD 16,113220$ ; Ctrl-G
.WORD 20,114226$ ; Ctrl-H
.WORD 24,114216$ ; Ctrl-J
.WORD 26,114772$ ; Ctrl-K
.WORD 30,113236$ ; Ctrl-L
.WORD 32,114336$ ; Ctrl-M
.WORD 34,105260$ ; Ctrl-N
.WORD 36,105306$ ; Ctrl-O
.WORD 44,114636$ ; Ctrl-R
.WORD 46,114514$ ; Ctrl-S
.WORD 50,114410$ ; Ctrl-T
.WORD 52,114310$ ; Ctrl-U
.WORD 54,114620$ ; Ctrl-V
.WORD 56,113670$ ; Ctrl-W
.WORD 62,114254$ ; Ctrl-Y
.WORD 64,114226$ ; Ctrl-Z
.WORD 66,113532$ ; Ctrl-[
.WORD 70,114106$ ; Ctrl-\
.WORD 72,114216$ ; Ctrl-]
.WORD 76,114772$ ; Ctrl-_
.WORD 112,113602$ ; Esc %
.WORD 172,113750$ ; Esc =
.WORD 174,113766$ ; Esc >
.WORD 176,114004$ ; Esc ?
.WORD 202,114106$ ; Esc A
.WORD 204,114216$ ; Esc B
.WORD 206,114254$ ; Esc C
.WORD 210,114226$ ; Esc D
.WORD 212,113712$ ; Esc E
.WORD 220,114660$ ; Esc H
.WORD 222,114106$ ; Esc I
.WORD 224,114714$ ; Esc J
.WORD 226,114772$ ; Esc K
.WORD 240,115010$ ; Esc P
.WORD 262,115626$ ; Esc Y
.WORD 264,115776$ ; Esc Z
.WORD 266,114006$ ; Esc [
.WORD 400,114106$ ; Esc 200
.WORD 402,114216$ ; Esc 201
.WORD 404,114226$ ; Esc 202
.WORD 406,114254$ ; Esc 203
.WORD 410,114316$ ; Esc 204
.WORD 412,114324$ ; Esc 205
.WORD 414,114336$ ; Esc 206
.WORD 416,114356$ ; Esc 207
.WORD 420,114404$ ; Esc 210
.WORD 422,114406$ ; Esc 211
.WORD 424,114410$ ; Esc 212
.WORD 426,114514$ ; Esc 213
.WORD 430,114620$ ; Esc 214
.WORD 432,114636$ ; Esc 215
.WORD 434,114654$ ; Esc 216
.WORD 436,114656$ ; Esc 217
.WORD 440,114260$ ; Esc 220
.WORD 442,114266$ ; Esc 221
.WORD 444,114274$ ; Esc 222
.WORD 446,114302$ ; Esc 223
.WORD 450,114660$ ; Esc 224
.WORD 452,113236$ ; Esc 225
.WORD 454,114714$ ; Esc 226
.WORD 456,114772$ ; Esc 227
.WORD 460,114310$ ; Esc 230
.WORD 462,115626$ ; Esc 231
.WORD 464,116014$ ; Esc 232
.WORD 466,116016$ ; Esc 233
.WORD 470,116020$ ; Esc 234
.WORD 472,0 ; Esc 235
.WORD 474,0 ; Esc 236
.WORD 476,0 ; Esc 237
.WORD 500,116022$ ; Esc Граф-@
.WORD 502,116066$ ; Esc Граф-A
.WORD 504,116144$ ; Esc Граф-B
.WORD 506,116234$ ; Esc Граф-C
.WORD 510,116274$ ; Esc Граф-D
.WORD 512,116374$ ; Esc Граф-E
.WORD 514,116462$ ; Esc Граф-F
.WORD 516,116212$ ; Esc Граф-G
.WORD 520,116542$ ; Esc Граф-H
.WORD 522,116544$ ; Esc Граф-I
.WORD 524,116546$ ; Esc Граф-J
.WORD 526,116550$ ; Esc Граф-K
.WORD 556,116552$ ; Esc Граф-W
.WORD 560,116600$ ; Esc Граф-X
.WORD 570,116624$ ; Esc Граф-\
.WORD 572,116632$ ; Esc Граф-]
.WORD 574,116742$ ; Esc Граф-^
.WORD 576,116750$ ; Esc Граф-_
.WORD 0
; ПОДПРОГРАММЫ ОБРАБОТКИ УПРАВЛЯЮЩИХ И ESC-ПОСЛЕДОВАТЕЛЬНОСТЕЙ
; П/п обработки Ctrl-G
113220$:BIS #600,@#177716 ; Включить звуковой сигнал (частота 500 Гц)
MOV #20,@#7046 ; Установить время (0.32 сек)
RETURN
; П/п обработки Ctrl-L, Esc 225
113236$:MOV @50(R5),-(SP) ; Сохранение содержимого рег. управления цветом
MOV @52(R5),-(SP)
MOV 44(R5),@50(R5) ; Засветка всего экрана цветом фона
MOV 44(R5),@52(R5)
CALL 113362$ ; Очистка экрана (заполнение цветом фона)
CALL 110572$ ; Установка ТВ на начало видеопамяти
MOV 30(R5),R4 ; Установка курсора в начало экрана
MOV R4,32(R5)
MOV @R4,@R5
ADD 22(R5),@R5
MOV 4(R5),16(R5)
MOV 12(R5),20(R5)
MOV (SP)+,@52(R5) ; Восстановление регистров управления цветом
MOV (SP)+,@50(R5)
MOV 72(R5),@#23164
RETURN
; П/п-мы очистки заданной области экрана (заполнение цветом фона)
; Параметры (для точки входа 113376$):
; R1 - начальный адрес;
; R2 - длина в байтах;
; R3 - число видеострок;
113344$:MOV @32(R5),R1
ADD 22(R5),R1
113354$:MOV #13,R3
BR 113372$
113362$:MOV 2(R5),R1
MOV 14(R5),R3
113372$:MOV 4(R5),R2
113376$:MOV 44(R5),@#177020; Загрузка в регистры кода фона цвета фона
MOV 44(R5),@#177022
MOV #177010,R4
MOV R1,@R4 ; Загрузить в регистр адреса планов нач. адрес
MOV #177024,R1
CLR R0
CMP R2,10(R5) ; Длина очищаемой строки равна истинной длине ?
BEQ 113500$ ; Да
MOV R2,-(SP) ; Сохранить длину строки
BR 113450$
113440$:MOV @SP,R2 ; R2 = длина очищаемой строки
SUB R2,@R4 ; Вычесть длину строки из адреса планов
ADD 10(R5),@R4 ; Прибавить истинную длину
113450$:MOV R0,@R1 ; Очистить байт строки
INC @R4 ; Переход к следующему адресу
SOB R2,113450$ ; Цикл по длине очищаемой части строки
SOB R3,113440$ ; Цикл по числу видеострок
TST (SP)+
113462$:MOV 40(R5),@#177020; Загр. в регистры кода фона цвета знакоместа
MOV 40(R5),@#177022
RETURN
113500$:MUL R2,R3 ; R3 = длина строки * число видеострок
113502$:MOV R0,@R1 ; Цикл очистки
INC @R4
SOB R3,113502$
BR 113462$
; Значения для загрузки в регистры кода фона (177020 и 177022)
113512$:.WORD 0,10421,21042,31463,42104,52525,63146,73567
; П/п обработки Ctrl-[ (Esc)
113532$:MOV SP,@#23152
MOV #2,@#23174 ; Активировать проверку на управляющие символы
113544$:MOV #1000,SP
CALL 110762$ ; Прочесть символ
ASL R0 ; Вызов п/п обработки Esc-последовательности
CALL @13142(R0)
CLR @#23174
MOV @#23152,SP
RETURN
; Точка входа при исполнении Esc %!3 в графическом режиме
113574$:MOV 2(SP),R0
BR 113620$
; П/п обработки Esc %
113602$:CALL 110762$ ; Прочесть символ
CMPB R0,#41 ; Это "!" ?
BNE 113632$ ; Нет
CALL 110762$
113620$:BIC #177774,R0
ASL R0 ; Вызов соответствующей п/п
CALL @113634$(R0)
113632$:RETURN
; Адреса п/п, вызывающиеся при обработке Esc %!
113634$:.WORD 113644$,113670$,113670$,113670$
; П/п обработки Esc %!0 (переход в графический режим)
113644$:CALL 111632$ ; Выключение курсора
CLR @#23174 ; Аннулировать проверку на управляющие символы
CALL @#135436$ ; Вызов п/п управления графикой
MOV 72(R5),@#23164
RETURN
; П/п обработки Ctrl-W, Esc %! (1-3)
113670$:JSR R5,105430$ ; Перекодировать клавиши под VT-52
.WORD 106634$
MOV #114226$,@#13162; При Ctrl-H выполнять шаг назад
CLR @#7154 ; Установить пункт VT-52 в меню УСТ
RETURN
; П/п обработки Esc E
113712$:JSR R5,105430$ ; Перекодировать клавиши под 15ИЭ-00-013
.WORD 107002$
MOV #114660$,@#13162; При Ctrl-H выполнять операцию Home
MOV #1,@#7154 ; Установить пункт 15ИЭ-00-013 в меню УСТ
RETURN
; П/п загрузки регистров кода цвета и фона
113736$:MOV R5,-(SP) ; Сохранить адрес текущей ТВ
CALL 110204$ ; Загрузить регистры
MOV (SP)+,R5 ; Восстановить адрес ТВ
RETURN
; П/п обработки Esc =
113750$:JSR R5,105346$ ; Установить режим ДКЛ
.WORD 107120$,11014
EMT 52 ; Вывести надпись "ДКЛ"
.WORD 107576$
RETURN
; П/п обработки Esc >
113766$:JSR R5,105400$ ; Сбросить режим ДКЛ
.WORD 107120$,11014
EMT 52 ; Стереть надпись "ДКЛ"
.WORD 107567$
RETURN
114004$:RETURN
; П/п обработки Esc [
114006$:CALL 110762$ ; Чтение символа
CMP R0,#62 ; Это "2" ?
BEQ 114050$ ; Да
CMP R0,#77 ; Это "?" ?
BEQ 114046$ ; Да
BR 114034$
114030$:CALL 110762$
114034$:CMPB R0,#162 ; Это "r" ?
BNE 114030$ ; Нет
CALL 113236$ ; Очистка экрана
114046$:RETURN
114050$:CALL 110762$
CMP R0,#150 ; Это "h" ?
BNE 114072$ ; Нет
MOV #2,@#7232 ; Запрет передачи одиночных ASCII-кодов клав.
BR 114104$
114072$:CMP R0,#154 ; Это "l" ?
BNE 114104$ ; Нет
CLR @#7232 ; Разрешение передачи одиночных ASCII-кодов
114104$:RETURN
; П/п обработки Ctrl-\, Esc A, Esc I, Esc 200
114106$:SUB @32(R5),@R5 ; Вычесть адрес начала видеостроки
SUB #54,32(R5) ; Перейти к предыд. символьной строке
CMP 32(R5),24(R5) ; Был переход за верх экрана ?
BHIS 114144$ ; Нет
MOV 26(R5),32(R5) ; Переход на низ экрана
SUB #54,32(R5)
114144$:ADD @32(R5),@R5 ; Прибавить к положению курсора тек. строку
CMP 20(R5),12(R5) ; Это была верхняя строка
BNE 114204$ ; Нет
ADD 74(R5),PC ; Рулон присутствует ?
BR 114212$ ; Нет
MOV 32(R5),30(R5)
MOV #-13,-(SP) ; Скроллинг 11(10) видеострок вниз
JMP 111544$
114204$:INC 20(R5) ; Количество оставшихся строк ++
RETURN
114212$:JMP 114324$ ; Позиционирование на низ текущей колонки
; П/п обработки Ctrl-J, Ctrl-], Esc B, Esc 201
114216$:SUB @32(R5),@R5 ; Вычесть адрес начала видеостроки
JMP 111444$ ; Перемещение вниз
; П/п обработки Ctrl-H (в системе команд VT-52), Ctrl-Z, Esc D, Esc 202
114226$:CMP 16(R5),4(R5) ; Курсор в начале строки ?
BEQ 114246$ ; Да
DEC @R5 ; Уменьшить позицию в строке
INC 16(R5) ; Увеличить количество оставшихся позиций
RETURN
114246$:CALL 114356$ ; Позиционирование в конец строки
BR 114106$ ; На одну строку вверх
; П/п обработки Ctrl-Y, Esc C, Esc 203
114254$:JMP 111422$ ; Перемещение курсора на одну позицию вправо
; П/п обработки Esc 220
114260$:CALL 114254$ ; Вправо
BR 114106$ ; Вверх
; П/п обработки Esc 221
114266$:CALL 114226$ ; Влево
BR 114216$ ; Вниз
; П/п обработки Esc 222
114274$:CALL 114106$ ; Вверх
BR 114226$ ; Влево
; П/п обработки Esc 223
114302$:CALL 114216$ ; Вниз
BR 114254$ ; Вправо
; П/п обработки Ctrl-U, Esc 230
114310$:CALL 114336$ ; В начало строки
BR 114216$ ; Вниз
; П/п обработки Esc 204
114316$:CLR R0 ; Номер начальной строки
JMP 115720$ ; Позиционирование
; П/п обработки Esc 205
114324$:MOV 12(R5),R0 ; R0 = номер последней строки
DEC R0
JMP 115720$ ; Позиционирование
; П/п обработки Ctrl-M, Esc 206
114336$:MOV 22(R5),@R5 ; Позиционирование в начало строки
ADD @32(R5),@R5
MOV 4(R5),16(R5) ; Количество оставшихся позиций = длина строки
RETURN
; П/п обработки Esc 207
114356$:MOV 4(R5),@R5 ; Позиционирование в конец строки
ADD 22(R5),@R5
DEC @R5
ADD @32(R5),@R5
MOV #1,16(R5) ; Осталась одна позиция
RETURN
114404$:RETURN
114406$:RETURN
; П/п обработки Ctrl-T, Esc 212
114410$:MOV 16(R5),R0 ; R0 = количество оставшихся позиций
DEC R0
BEQ 114474$ ; Осталась одна позиция
MOV @R5,R1
INC R1 ; R1 = текущий видеоадрес + 1
MOV #13,-(SP) ; Число видеострок
MOV #177010,R3
MOV #177024,R4
114440$:MOV R0,R2 ; R2 = число перемещаемых символов
MOV R1,@R3
BR 114452$
114446$:ADD #2,@R3 ; Цикл перемещения символов
114452$:TST @R4
DEC @R3
CLR @R4
SOB R2,114446$
ADD 10(R5),R1 ; Переход к следующей видеостроке
DEC @SP
BNE 114440$
TST (SP)+
114474$:MOV @R5,R1
ADD R0,R1 ; R1 = адрес конечного символа
MOV #1,R2 ; R2 = 1 (длина очищаемой части строки)
MOV #13,R3 ; Число очищаемых видеострок
JMP 113376$ ; Очистка
; П/п обработки Ctrl-S, Esc 213
114514$:MOV 16(R5),R0 ; R0 = количество оставшихся позиций
DEC R0
BEQ 114602$ ; Осталась одна позиция
MOV @R5,R1
ADD R0,R1 ; R1 = адрес конца строки
DEC R1
MOV #13,-(SP) ; Число видеострок
MOV #177010,R3
MOV #177024,R4
114546$:MOV R0,R2 ; R2 = число перемещаемых символов
MOV R1,@R3
BR 114560$
114554$:SUB #2,@R3 ; Цикл перемещения символов
114560$:TST @R4
INC @R3
CLR @R4
SOB R2,114554$
ADD 10(R5),R1 ; Переход к следующей видеостроке
DEC @SP
BNE 114546$
TST (SP)+
114602$:MOV @R5,R1 ; R1 = текущий видеоадрес
MOV #1,R2 ; R2 = длина очищаемой части строки
MOV #13,R3 ; R3 = число видеострок
JMP 113376$ ; Очистка
; П/п обработки Ctrl-V, Esc 214
114620$:DEC 20(R5) ; Уменьшить количество оставшихся строк
SUB #13,@#23170 ; Скроллинг вниз
JMP 114106$ ; Курсор вверх
; П/п обработки Ctrl-R, Esc 215
114636$:INC 20(R5) ; Увеличить количество оставшихся строк
ADD #13,@#23170 ; Скроллинг вверх
JMP 114216$ ; Курсор вниз
114654$:RETURN
114656$:RETURN
; П/п обработки Ctrl-H (в системе команд 15ИЭ-00-013), Esc H, Esc 224
114660$:MOV 30(R5),32(R5) ; Текущий адрес списка ВС - верх экрана
MOV 22(R5),@R5 ; Позиционирование курсора в верх. угол экрана
ADD @32(R5),@R5
MOV 4(R5),16(R5) ; Число ост. позиций = длина строки
MOV 12(R5),20(R5) ; Число ост. строк = число строк на экране
RETURN
; П/п обработки Esc J, Esc 226
114714$:CALL 114772$ ; Очистка конца строки
MOV 20(R5),-(SP) ; Количество оставшихся строк
MOV 32(R5),R1 ; R1 = текущий адрес списка ВС
BR 114762$
114732$:ADD #54,R1 ; Перейти к следующей строке
CMP R1,26(R5) ; Дошли до конца экрана ?
BNE 114750$ ; Нет
MOV 24(R5),R1 ; R1 = начальный адрес списка ВС
114750$:MOV R1,-(SP)
MOV @R1,R1
CALL 113354$ ; Очистка
MOV (SP)+,R1
114762$:DEC @SP
BNE 114732$
TST (SP)+
RETURN
; П/п обработки Ctrl-K, Esc K, Esc 227
114772$:MOV @R5,R1 ; R1 = текущий видеоадрес
MOV 16(R5),R2 ; R2 = количество оставшихся позиций в строке
MOV #13,R3 ; R3 = число видеострок
JMP 113376$ ; Очистка
; П/п обработки Esc P
115010$:CLR -(SP)
115012$:CALL 110762$ ; Чтение символа
MOV R0,-(SP) ; Сохранение его в стеке
CMPB R0,#73 ; Это ";" ?
BNE 115012$
115026$:CALL 110762$
MOV R0,-(SP)
CMPB R0,#73 ; Это ";" ?
BEQ 115424$ ; Да
CMPB R0,#174 ; Это "|" ?
BNE 115026$
115050$:TST (SP)+ ; Восстановление стека
BNE 115050$
ASR -4(SP) ; Была набрана "1" ?
BCS 115112$ ; Да
MOV #115342$,R1 ; R1 = список смещ. клавиш К1-К25 в табл. раск.
MOV #31,R2 ; R2 = 25(10) число программир. клавиш
115072$:MOV (R1)+,R0 ; Цикл очистки назначений клавиш
MOV #11140,7232(R0)
SOB R2,115072$
MOV #11142,@#13140 ; Установка указателя на начало буфера
115112$:CLR -(SP)
115114$:CALL 110762$
CMPB R0,#33 ; Это Escape ?
BEQ 115302$ ; Да
CMPB R0,#57 ; Это "/" ?
BEQ 115154$ ; Да
MOV @SP,R1 ; @SP = @SP * 10 + R0
MUL #10.,R1
BIC #177760,R0
ADD R0,R1
MOV R1,@SP
BR 115114$
115154$:MOV (SP)+,R0
CMP R0,#25. ; Номер клавиши в диапазоне 1 -- 25 ?
BHI 115112$ ; Нет
DEC R0
ASL R0
MOV 115342$(R0),R0 ; R0 = смещение клавиши в таблице раскладки
MOV @#13140,7232(R0); Запомнить адрес строки
115202$:CALL 110762$
CMPB R0,#33 ; Это Escape ?
BEQ 115304$
CMPB R0,#73 ; Это ";" ?
BEQ 115270$
CALL 115322$ ; Преобразование HEX-цифры в двоичный код
ASH #4,R0 ; R0 = R0 * 16
MOV R0,-(SP)
CALL 110762$
CALL 115322$
BIS (SP)+,R0
MOVB R0,@13140 ; Запомнить символ в строке
CMP @#13140,#13130 ; Достигнут конец буфера
BHI 115202$ ; Да
INC @#13140 ; Продвинуть указатель на следующую позицию
BR 115202$
115270$:CLRB @13140 ; Пометить конец строки
INC @#13140
BR 115112$
115302$:TST (SP)+
115304$:CLRB @13140
INC @#13140
CALL 110762$
RETURN
; П/п преобразования HEX-цифры в двоичное представление
115322$:CMP R0,#101 ; Цифра в диапазоне "A-F" ?
BLO 115334$ ; Нет
ADD #11,R0
115334$:BIC #177760,R0
RETURN
; Смещения для клавиш К1-К25 в таблице раскладки клавиатуры
115342$:.WORD 10,12,14,20,22,270,272,274,300,302,550,552,554,560,562
.WORD 1030,1032,1034,1040,1042,1310,1312,1314,1320,1322
115424$:MOV 2(SP),R0 ; R0 = код симв., шрифт кот. перепрограммир.
115430$:TST (SP)+ ; Восстановление стека
BNE 115430$
MOV R0,R1
ASL R0
ADD #14142,R0 ; R0 = указатель на ячейку адреса рисунка симв.
MOV R0,-(SP)
MUL #11,R1 ; Вычисление местоположения рисунка символа
ADD #15142,R1 ; R1 = адрес местоположения рисунка символа
MOV R1,-(SP)
115460$:CALL 110762$ ; Чтение символа
CMP R0,#33 ; Это Escape ?
BEQ 115550$ ; Да
CMP R0,#100 ; Это "@" ?
BNE 115460$ ; Нет
115500$:MOV @SP,@2(SP) ; Сохранить адрес рисунка в таблице
ADD #2,2(SP) ; Переход на следующую позицию в табл. адресов
JSR R5,115554$ ; Программирование первых пяти байт
.WORD 5
CALL 110762$
JSR R5,115554$ ; Программирование следующих шести байт
.WORD 6
CALL 110762$
CMP R0,#33 ; Это Escape
BNE 115500$
CALL 110762$
115550$:CMP (SP)+,(SP)+
RETURN
; П/п программирования заданного количества байт в рисунке символа
115554$:MOV #10,-(SP) ; Длина байта
115560$:MOV R5,-(SP)
CALL 110762$
MOV (SP)+,R5
CMP R0,#33 ; Это Escape ?
BEQ 115616$ ; Да
MOV 4(SP),R3 ; R3 = адрес рисунка
MOV @R5,R4 ; R4 = число программируемых байт
115604$:ASR R0 ; Цикл программирования
RORB (R3)+
SOB R4,115604$
DEC @SP
BNE 115560$
115616$:ADD (R5)+,4(SP) ; Перейти к следующей области рисунка
TST (SP)+
RTS R5
; П/п обработки Esc Y, Esc 231
115626$:CALL 110762$ ; Прочесть символ
SUB #40,R0
BMI 115652$
CMP R0,12(R5) ; Координата Y превышает диапазон ?
BHIS 115652$ ; Да
CALL 115720$ ; Позиционирование по координате Y
115652$:CALL 110762$
SUB #40,R0
BMI 115716$
CMP R0,4(R5) ; Координата X превышает диапазон ?
BHIS 115716$ ; Да
115672$:MOV 4(R5),16(R5) ; Позиционирование по координате X
SUB R0,16(R5) ; (16)R5 - кол-во оставшихся позиций
ADD @32(R5),R0 ; R0 = адрес видеопамяти начала строки + X
ADD 22(R5),R0 ; Плюс константа начального доступа
MOV R0,@R5 ; @R5 - адр.начала видеопамяти для выв. симв.
115716$:RETURN
; П/п позиционирования по координате Y
115720$:SUB @32(R5),@R5 ; @R5 - оставить координату X
MOV 12(R5),20(R5)
SUB R0,20(R5) ; 20(R5) - кол-во ост. символьных строк
MUL #11.*4,R0
ADD 30(R5),R1 ; R1 = адрес описания видеостроки
ADD 74(R5),PC ; Рулон присутствует ?
BR 115766$ ; Нет
CMP R1,#4670 ; Переход за границу списка ?
BLO 115766$ ; Нет
SUB #2170,R1 ; Подкорректировать значение
115766$:MOV R1,32(R5) ; 32(R5) - текущий адрес списка видеострок
ADD @R1,@R5 ; @R5 - адр.начала видеопамяти для выв.симв.
RETURN
; П/п обработки Esc Z
115776$:MOV #116010$,R0 ; R0 = адрес символьной строки
CALL 104160$ ; Передача адреса строки п/п обсл. клавиатуры
RETURN
116010$:.ASCIZ <33>"/Z" ; Терминал VT-100 в режиме VT-52
.EVEN
116014$:RETURN
116016$:RETURN
116020$:RETURN
; П/п обработки Esc Граф-@
116022$:ADD @#23176,PC ; Установлен режим отмены ?
BR 116036$ ; Нет
MOV 36(R5),R0 ; R0 = предыдущий цвет символа
BR 116046$
116036$:CALL 110762$ ; Прочесть символ
BIC #177770,R0
116046$:MOV R0,@#177016 ; Положить номер цвета в регистр кода цвета
116052$:MOV 34(R5),36(R5) ; Запомнить предыдущий цвет символа
MOV R0,34(R5) ; Сохранить номер цвета в ТВ
RETURN
; П/п обработки Esc Граф-A
116066$:ADD @#23176,PC ; Установлен режим отмены ?
BR 116102$ ; Нет
MOV 42(R5),R0 ; R0 = предыдущий цвет знакоместа
BR 116120$
116102$:CALL 110762$ ; Прочесть символ
BIC #177770,R0
ASL R0
MOV 113512$(R0),R0 ; R0 = код фонового цвета
116120$:MOV R0,@#177020 ; Положить номер фон. цвета в рег. кода фона
MOV R0,@#177022
116130$:MOV 40(R5),42(R5) ; Запомнить предыдущий цвет знакоместа
MOV R0,40(R5) ; Сохранить номер цвета знакоместа в ТВ
RETURN
; П/п обработки Esc Граф-B
116144$:ADD @#23176,PC ; Установлен режим отмены ?
BR 116160$ ; Нет
MOV 46(R5),R0 ; R0 = предыдущий цвет фона
BR 116046$
116160$:CALL 110762$ ; Прочесть символ
BIC #177770,R0
116170$:ASL R0
MOV 113512$(R0),R0 ; R0 = код фонового цвета
MOV 44(R5),46(R5) ; Запомнить предыдущий цвет фона
MOV R0,44(R5) ; Сохранить номер цвета фона в ТВ
RETURN
; П/п обработки Esc Граф-G
116212$:CALL 110762$ ; Прочесть символ
BIC #177770,R0 ; R0 = номер цвета курсора
MOVB R0,@64(R5) ; Изменить цвет курсора
116226$:MOV R0,70(R5) ; Сохранить цвет курсора в ТВ
RETURN
; П/п обработки Esc Граф-C
116234$:ADD @#23176,PC ; Установлен режим отмены ?
BR 116254$ ; Нет
CLR @#22554 ; Сбросить индикатор режима инверсии(подч.)
EMT 52 ; Очистить надпись "ИНВ" ("ПОДЧ")
.WORD 107605$
BR 116334$
116254$:MOV #<111704$-111322$>,56(R5); Установить режим инверсии (362)
INCB @#22554 ; Установить индикатор режима инверсии
EMT 52 ; Высветить надпись "ИНВ"
.WORD 107614$
RETURN
; П/п обработки Esc Граф-D
116274$:ADD @#23176,PC ; Установлен режим отмены ?
BR 116314$
CLR @#22554 ; Сбросить индикатор режима подчеркивания(инв.)
EMT 52 ; Погасить надпись "ПОДЧ" ("ИНВ")
.WORD 107605$
BR 116334$
116314$:MOV #<111660$-111322$>,56(R5); Установить режим подч. (336)
INCB @#22555 ; Установить индикатор режима подчеркивания
EMT 52 ; Высветить надпись "ПОДЧ"
.WORD 107623$
RETURN
116334$:CLR 56(R5) ; Установить нормальный режим
TSTB @#22554 ; Ранее был установлен режим инверсии ?
BEQ 116356$ ; Нет
MOV #364,56(R5) ; Установить режим инверсии
BR 116372$
116356$:TSTB @#22555 ; Ранее был установлен режим подчеркивания ?
BEQ 116372$ ; Нет
MOV #340,56(R5) ; Установить режим подчеркивания
116372$:RETURN
; П/п обработки Esc Граф-E
116374$:CALL 110762$ ; Прочесть символ
SUB #61,R0 ; Символ в диапазоне "1"-"4"
BMI 116422$ ; Нет
CMP R0,#3
BHI 116422$ ; Нет
ASL R0 ; Вызов соответствующей п/п
CALL @116424$(R0)
116422$:RETURN
; Адреса п/п для установки длины строки
116424$:.WORD 116434$,116450$,116460$,116460$
; П/п установки длины строки 80
116434$:MOV #120,4(R5) ; Установить длину строки 80
116442$:CLR 22(R5) ; Константа начального отступа = 0
RETURN
; П/п установки длины строки 40
116450$:MOV #50,4(R5) ; Установить длину строки 40
BR 116442$
116460$:RETURN
; П/п обработки Esc Граф-F
116462$:CALL 110762$ ; Прочесть символ
SUB #61,R0 ; Символ в диапазоне "1"-"4"
BMI 116524$ ; Нет
CMP R0,#4
BHIS 116524$ ; Нет
116502$:MOVB 116526$(R0),@22732; Установить соответствующий формат экрана
MOVB 116532$(R0),22744; Сохранить номер формата в ТВ
MOVB 116536$(R0),22662; Занести новую длину строки в ТВ
116524$:RETURN
; Биты формата экрана для загрузки в регистр управления отображением
116526$:.BYTE 0,20,40,60
; Номера форматов для загрузки в ТВ
116532$:.BYTE 1,2,4,10
; Длины строк
116536$:.BYTE 120,50,24,12
116542$:RETURN
116544$:RETURN
116546$:RETURN
116550$:RETURN
; П/п обработки Esc Граф-W
116552$:ADD @#23176,PC ; Установлен режим отмены ?
BR 116570$ ; Нет
BIS #1000,@#177054 ; Выключить сетевой таймер в канале ЦП
RETURN
116570$:BIC #1000,@#177054 ; Включить сетевой таймер в канале ЦП
RETURN
; П/п обработки Esc Граф-X
116600$:MTPS #200 ; Запретить прерывания
MOVB #177,@23160 ; Убрать курсор с экрана
CALL 104026$ ; Вызов п/п ПАУЗА
MTPS #0 ; Разрешить прерывания
RETURN
; П/п обработки Esc Граф-\
116624$:INC @#7072 ; Установить индикатор вызова меню ЗАГРУЗКА
RETURN
; П/п обработки Esc Граф-]
116632$:ADD @#23176,PC ; Установлен режим отмены ?
BR 116706$ ; Нет
JSR R5,105400$ ; Установить пользовательский режим клавиатуры
.WORD 107310$,11054
CLR @#7146 ; Сбросить индикатор системного режима
ADD @#22550,PC ; Разрешена установка/снятие сигнала HALT ?
BR 116664$ ; Да
RETURN
116664$:BIC #20,@#177716 ; Снять сигнал HALT в ЦП
MOV #70046,@#177010; Сброс ключа продолжения в области ОЗУ ЦП
CLR @#177014
RETURN
116706$:JSR R5,105346$ ; Установить системный режим клавиатуры
.WORD 107310$,11054
INC @#7146 ; Установить индикатор системного режима
ADD @#22550,PC ; Разрешена установка/снятие сигнала HALT ?
BR 116732$ ; Да
RETURN
116732$:BIS #20,@#177716 ; Установить сигнал HALT в ЦП
RETURN
; П/п обработки Esc Граф-^
116742$:INC @#7100 ; Установить индикатор вызова тест-программы
RETURN
; П/п обработки Esc Граф-_
116750$:MOV #2,@#23176 ; Установить режим отмены
116756$:CALL 110762$ ; Прочесть символ
CMP R0,#33 ; Это Escape ?
BEQ 116756$ ; Да
ASL R0 ; Вызов соответствующей п/п
CALL @13142(R0)
CLR @#23176 ; Сбросить режим отмены
RETURN
; П/п установки цвета курсора, вызываемая при исп. послед. Esc TD (графика)
117004$:MOV 2(SP),R0
BIC #177760,R0 ; R0 = номер цвета курсора
MOV R0,@#7166 ; Сохр. ном. цвета кур. в пункте УСТ/цв. кур.
MOVB R0,@22742 ; Изменить цвет курсора
RETURN
; П/п установки цветов символа, знакоместа и фона, вызываемая при исполнении
; последовательности Esc LI (графика)
117026$:MOV R5,-(SP) ; Сохранить R5
MOV @#23150,R5 ; R5 = адрес текущей ТВ
MOV 4(SP),R0 ; R0 = номер цвета символа
BMI 117052$ ; Если отрицательный - нет установки
MOV R0,34(R5) ; Сохранить номер цвета в ТВ
MOV R0,@#7160 ; Сохр. ном. цвета симв. в пункте УСТ/цв. симв.
117052$:MOV 6(SP),R0 ; R0 = номер цвета знакоместа
BMI 117074$ ; Если отрицательный - нет установки
MOV R0,@#7162 ; Сохр. ном. цвета зн. в пункте УСТ/цв. зн.
ASL R0
MOV 113512$(R0),40(R5); Сохранить номер фонового цвета в ТВ
117074$:MOV 10(SP),R0 ; R0 = номер цвета фона
BMI 117116$ ; Если отрицательный - нет установки
MOV R0,@#7164 ; Сохр. ном. цвета фона в пункте УСТ/цвет фона
ASL R0
MOV 113512$(R0),44(R5); Сохранить номер фонового цвета в ТВ
117116$:CALL 110230$ ; Заполнить регистры кода цвета и фона
MOV (SP)+,R5 ; Восстановить R5
RETURN
; П/п исполнения запроса EMT 42 (вывод символа)
117126$:CALL 117136$ ; Занести символ в буфер
TRAP 0 ; Запуск цикла задач
RETURN
; П/п заноса символа в буфер
117136$:MOVB R0,@22544 ; Занести символ в буфер
INC @#22544 ; Корректировка указателя
BIC #200,@#22544
INC @#7064 ; Увеличить счетчик символов
RETURN
; П/п исполнения запроса EMT 44 (вывод строки символов)
117162$:MOV @16(SP),R1 ; R1 = адрес строки символов
ADD #2,16(SP) ; Коррекция адреса возврата
; П/п исполнения запроса EMT 46 (вывод строки символов)
117174$:JSR R5,117206$ ; Занести строку в буфер
TRAP 0 ; Запуск цикла задач
RETURN
; П/п заноса строки символов в буфер
117204$:MOV (R5)+,R1 ; R1 = адрес строки символов
117206$:MOV @#22544,R0 ; R0 = значение указателя для записи в буфер
BR 117224$
117214$:BIC #200,R0 ; Коррекция указателя
INC @#7064 ; Увеличить счетчик символов
117224$:MOVB (R1)+,(R0)+ ; Занести очередной символ в буфер
BNE 117214$ ; Еще не конец строки
DEC R0
MOV R0,@#22544
RTS R5
; П/п исполнения запроса EMT 56 (вывод в нижнюю инф. строку)
117240$:MOV #23052,R5 ; R5 = адрес ТВ для нижней инф. строки
BR 117260$
117246$:BR 117376$
; П/п исполнения запроса EMT 52 (вывод в верхнюю инф. строку)
117250$:ADD @#7150,PC ; Разрешение/запрет вывода в верхнюю строку
MOV #22560,R5 ; R5 = адрес ТВ для верхней инф. строки
117260$:MOV 34(R5),@#177016; Загрузка регистров кода цвета и фона
MOV 40(R5),@#177020
MOV 40(R5),@#177022
MOV @32(R5),@R5 ; Вычисление видеоадреса
MOV 4(R5),16(R5)
MOV @16(SP),R1 ; R1 = адрес строки
MOVB (R1)+,R0 ; R0 = начальная позиция
ADD R0,@R5
SUB R0,16(R5)
BR 117342$
117332$:MOV R1,-(SP)
CALL 111272$ ; Рисование символа
MOV (SP)+,R1
117342$:CLR R0
BISB (R1)+,R0 ; R0 = очередной символ
BNE 117332$ ; Еще не конец строки
MOV @#23150,R5 ; R5 = адрес текущей ТВ
MOV 34(R5),@#177016; Восстановление регистров кода цвета и фона
MOV 40(R5),@#177020
MOV 40(R5),@#177022
117376$:ADD #2,16(SP) ; Коррекция адреса возврата
RETURN
117406$:RETURN
117410$:RETURN
117412$:RETURN
117414$:RETURN
117416$:RETURN
117420$:RETURN
117422$:RETURN
117424$:RETURN
117426$:RETURN
; *** ТАБЛИЦА РИСУНКОВ СИМВОЛОВ ***
117430$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-@
117443$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-A
117456$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-B
117471$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-C
117504$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-D
117517$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-E
117532$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-F
117545$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-G
117560$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-H
117573$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-I
117606$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-J
117621$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-K
117634$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-L
117647$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-M
117662$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-N
117675$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-O
117710$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-P
117723$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-Q
117736$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-R
117751$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-S
117764$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-T
117777$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-U
120012$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-V
120025$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-W
120040$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-X
120053$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-Y
120066$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-Z
120101$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-[
120114$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-\
120127$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-]
120142$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-^
120155$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Ctrl-_
120170$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; Space
120203$:.BYTE 0,20,20,20,20,20,20,0,20,0,0 ; !
120216$:.BYTE 0,44,44,22,0,0,0,0,0,0,0 ; "
120231$:.BYTE 0,0,44,44,176,44,176,44,44,0,0 ; #
120244$:.BYTE 0,0,102,74,102,102,102,74,102,0,0 ; $
120257$:.BYTE 0,0,206,106,40,20,10,304,302,0,0 ; %
120272$:.BYTE 0,30,44,44,30,24,242,102,274,0,0 ; &
120305$:.BYTE 0,60,20,10,0,0,0,0,0,0,0 ; '
120320$:.BYTE 0,40,20,10,10,10,10,20,40,0,0 ; (
120333$:.BYTE 0,10,20,40,40,40,40,20,10,0,0 ; )
120346$:.BYTE 0,0,0,20,124,70,124,20,0,0,0 ; *
120361$:.BYTE 0,0,20,20,20,376,20,20,20,0,0 ; +
120374$:.BYTE 0,0,0,0,0,0,0,30,30,20,10 ; ,
120407$:.BYTE 0,0,0,0,0,176,0,0,0,0,0 ; -
120422$:.BYTE 0,0,0,0,0,0,0,30,30,0,0 ; .
120435$:.BYTE 0,0,200,100,40,20,10,4,2,0,0 ; /
120450$:.BYTE 0,74,102,142,122,112,106,102,74,0,0 ; 0
120463$:.BYTE 0,20,30,24,20,20,20,20,174,0,0 ; 1
120476$:.BYTE 0,74,102,102,40,20,10,104,176,0,0 ; 2
120511$:.BYTE 0,176,40,20,70,100,100,102,74,0,0 ; 3
120524$:.BYTE 0,40,60,50,44,42,176,40,40,0,0 ; 4
120537$:.BYTE 0,176,2,2,76,100,100,102,74,0,0 ; 5
120552$:.BYTE 0,74,102,2,76,102,102,102,74,0,0 ; 6
120565$:.BYTE 0,176,102,40,20,10,4,2,2,0,0 ; 7
120600$:.BYTE 0,74,102,102,74,102,102,102,74,0,0 ; 8
120613$:.BYTE 0,74,102,102,102,174,100,102,74,0,0 ; 9
120626$:.BYTE 0,0,0,30,30,0,0,30,30,0,0 ; :
120641$:.BYTE 0,0,0,30,30,0,0,30,30,20,10 ;;
120654$:.BYTE 0,0,40,20,10,4,10,20,40,0,0 ; <
120667$:.BYTE 0,0,0,0,176,0,176,0,0,0,0 ; =
120702$:.BYTE 0,0,4,10,20,40,20,10,4,0,0 ; >
120715$:.BYTE 0,70,104,100,40,20,20,0,20,0,0 ; ?
120730$:.BYTE 0,0,74,102,200,234,222,222,154,0,0 ; @
120743$:.BYTE 0,30,44,102,102,176,102,102,102,0,0 ; A
120756$:.BYTE 0,76,102,102,76,102,102,102,76,0,0 ; B
120771$:.BYTE 0,74,102,2,2,2,2,102,74,0,0 ; C
121004$:.BYTE 0,76,104,204,204,204,204,104,76,0,0 ; D
121017$:.BYTE 0,176,2,2,76,2,2,2,176,0,0 ; E
121032$:.BYTE 0,176,2,2,76,2,2,2,2,0,0 ; F
121045$:.BYTE 0,74,102,2,2,162,102,102,74,0,0 ; G
121060$:.BYTE 0,102,102,102,102,176,102,102,102,0,0 ; H
121073$:.BYTE 0,70,20,20,20,20,20,20,70,0,0 ; I
121106$:.BYTE 0,70,20,20,20,20,20,22,14,0,0 ; J
121121$:.BYTE 0,102,42,22,16,12,22,42,102,0,0 ; K
121134$:.BYTE 0,2,2,2,2,2,2,2,176,0,0 ; L
121147$:.BYTE 0,202,306,252,222,202,202,202,202,0,0 ; M
121162$:.BYTE 0,102,102,106,112,122,142,102,102,0,0 ; N
121175$:.BYTE 0,74,102,102,102,102,102,102,74,0,0 ; O
121210$:.BYTE 0,76,102,102,102,76,2,2,2,0,0 ; P
121223$:.BYTE 0,74,102,102,102,102,102,122,74,100,0 ; Q
121236$:.BYTE 0,76,102,102,102,76,22,42,102,0,0 ; R
121251$:.BYTE 0,74,102,2,74,100,100,102,74,0,0 ; S
121264$:.BYTE 0,376,20,20,20,20,20,20,20,0,0 ; T
121277$:.BYTE 0,102,102,102,102,102,102,102,74,0,0 ; U
121312$:.BYTE 0,202,202,202,202,202,104,50,20,0,0 ; V
121325$:.BYTE 0,202,202,202,202,222,252,306,202,0,0 ; W
121340$:.BYTE 0,102,102,44,30,30,44,102,102,0,0 ; X
121353$:.BYTE 0,202,202,104,50,20,20,20,20,0,0 ; Y
121366$:.BYTE 0,176,100,40,20,10,4,2,176,0,0 ; Z
121401$:.BYTE 0,70,10,10,10,10,10,10,70,0,0 ; [
121414$:.BYTE 0,0,2,4,10,20,40,100,200,0,0 ; \
121427$:.BYTE 0,70,40,40,40,40,40,40,70,0,0 ; ]
121442$:.BYTE 0,0,0,0,176,100,100,0,0,0,0 ; ^
121455$:.BYTE 0,0,0,0,0,0,0,0,176,0,0 ; _
121470$:.BYTE 0,30,20,40,0,0,0,0,0,0,0 ; `
121503$:.BYTE 0,0,0,74,100,174,102,102,274,0,0 ; a
121516$:.BYTE 0,2,2,72,106,102,102,106,72,0,0 ; b
121531$:.BYTE 0,0,0,74,102,2,2,102,74,0,0 ; c
121544$:.BYTE 0,100,100,134,142,102,102,142,134,0,0 ; d
121557$:.BYTE 0,0,0,74,102,102,176,2,174,0,0 ; e
121572$:.BYTE 0,60,110,10,34,10,10,10,10,0,0 ; f
121605$:.BYTE 0,0,0,134,142,102,102,142,134,100,74 ; g
121620$:.BYTE 0,2,2,72,106,102,102,102,102,0,0 ; h
121633$:.BYTE 0,20,0,30,20,20,20,20,70,0,0 ; i
121646$:.BYTE 0,20,0,20,20,20,20,20,20,22,14 ; j
121661$:.BYTE 0,2,2,42,22,16,22,42,102,0,0 ; k
121674$:.BYTE 0,30,20,20,20,20,20,20,70,0,0 ; l
121707$:.BYTE 0,0,0,156,222,222,222,222,222,0,0 ; m
121722$:.BYTE 0,0,0,72,106,102,102,102,102,0,0 ; n
121735$:.BYTE 0,0,0,74,102,102,102,102,74,0,0 ; o
121750$:.BYTE 0,0,0,72,106,102,102,106,72,2,2 ; p
121763$:.BYTE 0,0,0,134,142,102,102,142,134,100,100 ; q
121776$:.BYTE 0,0,0,72,106,2,2,2,2,0,0 ; r
122011$:.BYTE 0,0,0,74,2,74,100,102,74,0,0 ; s
122024$:.BYTE 0,10,10,34,10,10,10,110,60,0,0 ; t
122037$:.BYTE 0,0,0,102,102,102,102,142,134,0,0 ; u
122052$:.BYTE 0,0,0,202,202,202,104,50,20,0,0 ; v
122065$:.BYTE 0,0,0,202,202,202,222,222,154,0,0 ; w
122100$:.BYTE 0,0,0,102,44,30,30,44,102,0,0 ; x
122113$:.BYTE 0,0,0,102,102,102,44,30,10,4,2 ; y
122126$:.BYTE 0,0,0,176,40,20,10,4,176,0,0 ; z
122141$:.BYTE 0,0,140,20,20,14,20,20,140,0,0 ; {
122154$:.BYTE 0,0,20,20,20,20,20,20,20,0,0 ; |
122167$:.BYTE 0,0,14,20,20,140,20,20,14,0,0 ; }
122202$:.BYTE 0,176,0,0,0,0,0,0,0,0,0 ; ~
122215$:.BYTE 0,176,176,176,176,176,176,176,176,0,0 ; Delete
122230$:.BYTE 0,10,34,52,10,10,10,10,10,0,0 ; 200
122243$:.BYTE 0,10,10,10,10,10,52,34,10,0,0 ; 201
122256$:.BYTE 0,0,0,4,2,377,2,4,0,0,0 ; 202
122271$:.BYTE 0,0,0,40,100,377,100,40,0,0,0 ; 203
122304$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 204
122317$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 205
122332$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 206
122345$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 207
122360$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 210
122373$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 211
122406$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 212
122421$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 213
122434$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 214
122447$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 215
122462$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 216
122475$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 217
122510$:.BYTE 0,0,0,104,50,20,50,104,0,0,0 ; 220
122523$:.BYTE 0,0,0,20,0,174,0,20,0,0,0 ; 221
122536$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 222
122551$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 223
122564$:.BYTE 0,100,100,100,110,104,176,4,10,0,0 ; 224
122577$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 225
122612$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 226
122625$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 227
122640$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 230
122653$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 231
122666$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 232
122701$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 233
122714$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 234
122727$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 235
122742$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 236
122755$:.BYTE 0,0,0,0,0,0,0,0,0,0,0 ; 237
122770$:.BYTE 24,24,24,24,24,27,24,24,24,24,24 ; Граф-@
123003$:.BYTE 10,10,10,10,10,377,0,0,0,0,0 ; Граф-A
123016$:.BYTE 24,24,24,24,24,364,24,24,24,24,24 ; Граф-B
123031$:.BYTE 0,0,0,0,0,17,10,10,10,10,10 ; Граф-C
123044$:.BYTE 24,24,24,24,24,24,24,24,24,24,24 ; Граф-D
123057$:.BYTE 10,10,10,10,10,370,10,10,10,10,10 ; Граф-E
123072$:.BYTE 10,10,10,10,10,370,0,0,0,0,0 ; Граф-F
123105$:.BYTE 24,24,24,24,364,4,364,24,24,24,24 ; Граф-G
123120$:.BYTE 0,0,0,0,374,4,364,24,24,24,24 ; Граф-H
123133$:.BYTE 10,10,10,10,377,0,377,10,10,10,10 ; Граф-I
123146$:.BYTE 0,0,0,0,0,370,10,10,10,10,10 ; Граф-J
123161$:.BYTE 0,0,0,0,0,377,10,10,10,10,10 ; Граф-K
123174$:.BYTE 24,24,24,24,367,0,377,0,0,0,0 ; Граф-L
123207$:.BYTE 24,24,24,24,24,377,0,0,0,0,0 ; Граф-M
123222$:.BYTE 10,10,10,10,10,17,10,10,10,10,10 ; Граф-N
123235$:.BYTE 24,24,24,24,367,0,367,24,24,24,24 ; Граф-O
123250$:.BYTE 10,10,10,10,10,377,10,10,10,10,10 ; Граф-P
123263$:.BYTE 10,10,10,10,370,10,370,10,10,10,10 ; Граф-Q
123276$:.BYTE 24,24,24,24,24,367,24,24,24,24,24 ; Граф-R
123311$:.BYTE 0,0,0,0,0,377,24,24,24,24,24 ; Граф-S
123324$:.BYTE 10,10,10,10,377,0,377,0,0,0,0 ; Граф-T
123337$:.BYTE 0,0,0,0,0,377,0,0,0,0,0 ; Граф-U
123352$:.BYTE 24,24,24,24,364,4,374,0,0,0,0 ; Граф-V
123365$:.BYTE 10,10,10,10,10,10,10,10,10,10,10 ; Граф-W
123400$:.BYTE 0,0,0,0,377,0,377,10,10,10,10 ; Граф-X
123413$:.BYTE 10,10,10,10,10,17,0,0,0,0,0 ; Граф-Y
123426$:.BYTE 0,0,0,0,377,0,377,0,0,0,0 ; Граф-Z
123441$:.BYTE 24,24,24,24,27,20,27,24,24,24,24 ; Граф-[
123454$:.BYTE 24,24,24,24,27,20,37,0,0,0,0 ; Граф-\
123467$:.BYTE 0,0,0,0,377,0,367,24,24,24,24 ; Граф-]
123502$:.BYTE 10,10,10,10,17,10,17,10,10,10,10 ; Граф-^
123515$:.BYTE 0,0,0,0,37,20,27,24,24,24,24 ; Граф-_
123530$:.BYTE 0,0,0,142,222,222,236,222,142,0,0 ; ю
123543$:.BYTE 0,0,0,74,100,174,102,102,274,0,0 ; а
123556$:.BYTE 0,100,74,2,76,102,102,102,74,0,0 ; б
123571$:.BYTE 0,0,0,42,42,42,42,42,176,100,0 ; ц
123604$:.BYTE 0,0,0,160,110,104,104,104,376,202,0 ; д
123617$:.BYTE 0,0,0,74,102,102,176,2,174,0,0 ; е
123632$:.BYTE 0,0,0,20,174,222,222,222,174,20,20 ; ф
123645$:.BYTE 0,0,0,176,102,2,2,2,2,0,0 ; г
123660$:.BYTE 0,0,0,102,44,30,30,44,102,0,0 ; х
123673$:.BYTE 0,0,0,102,142,122,112,106,102,0,0 ; и
123706$:.BYTE 0,30,0,102,142,122,112,106,102,0,0 ; й
123721$:.BYTE 0,0,0,102,42,22,36,42,102,0,0 ; к
123734$:.BYTE 0,0,0,160,110,104,104,104,102,0,0 ; л
123747$:.BYTE 0,0,0,202,306,252,222,202,202,0,0 ; м
123762$:.BYTE 0,0,0,102,102,102,176,102,102,0,0 ; н
123775$:.BYTE 0,0,0,74,102,102,102,102,74,0,0 ; о
124010$:.BYTE 0,0,0,176,102,102,102,102,102,0,0 ; п
124023$:.BYTE 0,0,0,174,102,102,174,104,102,0,0 ; я
124036$:.BYTE 0,0,0,72,106,102,102,106,72,2,2 ; р
124051$:.BYTE 0,0,0,74,102,2,2,102,74,0,0 ; с
124064$:.BYTE 0,0,0,376,20,20,20,20,20,0,0 ; т
124077$:.BYTE 0,0,0,102,102,102,44,30,10,4,2 ; у
124112$:.BYTE 0,0,0,222,124,70,70,124,222,0,0 ; ж
124125$:.BYTE 0,0,0,76,102,76,102,102,76,0,0 ; в
124140$:.BYTE 0,0,0,2,2,76,102,102,76,0,0 ; ь
124153$:.BYTE 0,0,0,202,202,236,242,242,236,0,0 ; ы
124166$:.BYTE 0,0,0,74,100,70,100,100,74,0,0 ; з
124201$:.BYTE 0,0,0,222,222,222,222,222,376,0,0 ; ш
124214$:.BYTE 0,0,0,76,100,100,174,100,76,0,0 ; э
124227$:.BYTE 0,0,0,222,222,222,222,222,376,200,200 ; щ
124242$:.BYTE 0,0,0,102,102,102,174,100,100,0,0 ; ч
124255$:.BYTE 0,0,0,7,5,174,204,204,174,0,0 ; ъ
124270$:.BYTE 0,142,222,222,222,236,222,222,142,0,0 ; Ю
124303$:.BYTE 0,30,44,102,102,176,102,102,102,0,0 ; А
124316$:.BYTE 0,176,2,2,76,102,102,102,76,0,0 ; Б
124331$:.BYTE 0,102,102,102,102,102,102,102,376,200,0 ; Ц
124344$:.BYTE 0,160,110,104,104,104,104,104,376,202,0 ; Д
124357$:.BYTE 0,176,2,2,76,2,2,2,176,0,0 ; Е
124372$:.BYTE 0,20,174,222,222,222,222,174,20,20,0 ; Ф
124405$:.BYTE 0,176,102,2,2,2,2,2,2,0,0 ; Г
124420$:.BYTE 0,102,102,44,30,30,44,102,102,0,0 ; Х
124433$:.BYTE 0,102,102,142,122,112,106,102,102,0,0 ; И
124446$:.BYTE 30,102,102,142,122,112,106,102,102,0,0 ; Й
124461$:.BYTE 0,102,42,22,16,22,42,102,202,0,0 ; К
124474$:.BYTE 0,160,110,104,104,104,104,104,102,0,0 ; Л
124507$:.BYTE 0,202,306,252,222,202,202,202,202,0,0 ; М
124522$:.BYTE 0,102,102,102,176,102,102,102,102,0,0 ; Н
124535$:.BYTE 0,74,102,102,102,102,102,102,74,0,0 ; О
124550$:.BYTE 0,176,102,102,102,102,102,102,102,0,0 ; П
124563$:.BYTE 0,174,102,102,102,174,110,104,102,0,0 ; Я
124576$:.BYTE 0,76,102,102,102,76,2,2,2,0,0 ; Р
124611$:.BYTE 0,74,102,2,2,2,2,102,74,0,0 ; С
124624$:.BYTE 0,376,222,20,20,20,20,20,20,0,0 ; Т
124637$:.BYTE 0,102,102,102,102,174,100,102,74,0,0 ; У
124652$:.BYTE 0,222,222,124,70,124,222,222,222,0,0 ; Ж
124665$:.BYTE 0,76,102,102,76,102,102,102,76,0,0 ; В
124700$:.BYTE 0,2,2,2,76,102,102,102,76,0,0 ; Ь
124713$:.BYTE 0,202,202,202,236,242,242,242,236,0,0 ; Ы
124726$:.BYTE 0,74,102,100,70,100,100,102,74,0,0 ; З
124741$:.BYTE 0,222,222,222,222,222,222,222,376,0,0 ; Ш
124754$:.BYTE 0,74,102,200,200,370,200,102,74,0,0 ; Э
124767$:.BYTE 0,222,222,222,222,222,222,222,376,200,200 ; Щ
125002$:.BYTE 0,102,102,102,102,174,100,100,100,0,0 ; Ч
125015$:.BYTE 0,7,5,4,174,204,204,204,174,0,0 ; Ъ
.EVEN
Автор: SuperMax 29.1.2021, 1:21
Код
; ******************************************************
; * *
; * ДРАЙВЕР КАНАЛА 2 *
; * *
; * Адреса 125030 - 135435 *
; * *
; ******************************************************
; *** ОСНОВНАЯ ПОДПРОГРАММА ОБСЛУЖИВАНИЯ КАНАЛА 2 ***
125030$:MOV @#23200,R0 ; R0 = адрес массива параметров (МП) в ОЗУ ЦП
CLC ; Преобр. для загрузки в рег. адреса планов
ROR R0
MOV R0,@#23200
INC R0 ; R0 = адрес типа устройства
MOV R0,@#177010
MOVB @#177014,R0 ; R0 = тип устройства
MOV R0,R5
ASH #-3,R0
CMP R0,#3 ; Тип устройства в пределах 0 - 37 ?
BHI 125116$ ; Нет
ASL R0
BNE 125104$ ; Обслуживается не дисковод
TST @#7044 ; Разрешено обращение к дисководу ?
BMI 125116$ ; Нет
125104$:CALL @125124$(R0) ; Вызов соответствующей п/п обслуживания уст-ва
125110$:DEC @#7062 ; Уменьшить значение флага вызова
RETURN
125116$:CALL 125162$ ; Вызов п/п обслуживания кассеты ПЗУ
BR 125110$
; Адреса п/п обслуживания устройств (дисковод, магнитофон, кассета ПЗУ, ОЗУ ПП)
125124$:.WORD 131176$,126236$,125162$,125644$
; П/п окончания обслуживания устройства
125134$:CLRB @#23334 ; Сбросить код возврата (все нормально)
125140$:MOV @#23200,@#177010
MOV @#23334,@#177014; Записать код возврата в ОЗУ ЦП
125154$:TST @#177064 ; Восст. готовность канала 2 со стороны ЦП
RETURN
; П/п обслуживания кассеты ПЗУ
125162$:JSR R5,125560$ ; Чтение МП
.WORD 5
CMPB #10,23335 ; Код функции = 10 (чтение) ?
BEQ 125210$
125200$:MOVB #2,23334 ; Код возврата = 2 (ошибочный МП)
BR 125520$
125210$:MOV 23340,R1 ; R1 = адрес кассеты ПЗУ
CMP #60000,R1 ; Он превышает 60000 ?
BLOS 125200$ ; Да
BIC #1,R1
MOV 23342,R2 ; R2 = адрес буфера в ОЗУ ЦП
CMP #160000,R2 ; Он превышает 160000 ?
BLOS 125200$ ; Да
ASR R2
BIC #100000,R2
MOV 23344,R3 ; R3 = число считываемых слов
BEQ 125514$ ; Оно равно нулю
MOVB 23337,R0 ; R0 = номер кассеты ПЗУ
MTPS #200 ; Запретить прерывания
MOV @#4,R5 ; Сохранить значение 4 вектора в R5
MOV #125544$,@#4 ; Загрузить новое значение вектора
BIC #1,@#177054 ; Откл. сист. ПЗУ в диапазоне 100000-117777
ASR R0 ; Кассета N1 ?
BCS 125320$ ; Нет
BIC #10,@#177054 ; Выбор кассеты N1
BR 125326$
125320$:BIS #10,@#177054 ; Выбор кассеты N2
125326$:BIC #6,@#177054 ; Ни одного банка не выбрано
CMP R1,#17776 ; Адрес кассеты меньше 20000 ?
BHI 125354$ ; Нет
MOV #2,R4
BIS R4,@#177054 ; Выбор банка N1
BR 125406$
125354$:CMP R1,#37776 ; Адрес кассеты меньше 40000 ?
BHI 125376$ ; Нет
BIS #4,@#177054 ; Выбор банка N2
MOV #1,R4
BR 125406$
125376$:BIS #6,@#177054 ; Выбор банка N3
CLR R4
125406$:BIC #60000,R1
BIS #100000,R1
MOV #120000,R0
SUB R1,R0 ; Вычисление граничных значений
ASR R0
125426$:CMP R3,R0 ; Область перекачки содержится в одном банке ?
BHI 125440$ ; Нет
MOV R3,R0
CLR R3
BR 125442$
125440$:SUB R0,R3 ; Вычесть из числа запрошенных слов
125442$:MOV R2,@#177010 ; Цикл перекачки
MOV (R1)+,@#177014
INC R2
CMP #70000,R2 ; Произошел выход за диапазон ОЗУ ЦП (160000) ?
BLOS 125200$ ; Да
SOB R0,125442$
TST R3 ; Перекачка закончена ?
BEQ 125514$ ; Да
DEC R4 ; Переход к следующему банку
BMI 125200$ ; Переход за границу кассеты ПЗУ
ADD #2,@#177054 ; Установить следующий банк
MOV #100000,R1
MOV #10000,R0
BR 125426$
125514$:CLRB 23334 ; Очистить код возврата (все нормально)
125520$:BIS #1,@#177054 ; Подключить системное ПЗУ
MOV R5,@#4 ; Восстановить 4 вектор
MTPS #0 ; Разрешить прерывания
CALL 125140$ ; Завершить обслуживание
RETURN
; П/п обработки прерывания 4 при чтении с кассеты ПЗУ
125544$:MOVB #1,23334 ; Код возврата = 1 (отсутствует банк ПЗУ)
TST (SP)+ ; Вычеркнуть из стека значения PC и PS
TST (SP)+
BR 125520$
; П/п чтения МП из ОЗУ ЦП
125560$:MOV (R5)+,R0 ; R0 = число слов для чтения
MOV #23334,R1 ; R1 = адрес МП в ОЗУ ПП
MOV @#23200,@#177010
BR 125602$
125576$:INC @#177010 ; Цикл чтения
125602$:MOV @#177014,(R1)+
SOB R0,125576$
RTS R5
; П/п записи МП в ОЗУ ЦП
125612$:MOV (R5)+,R0 ; R0 = число слов для записи
MOV #23334,R1 ; R1 = адрес МП в ОЗУ ПП
MOV @#23200,@#177010
BR 125634$
125630$:INC @#177010 ; Цикл записи
125634$:MOV (R1)+,@#177014
SOB R0,125630$
RTS R5
; П/п обслуживания функций работы с памятью ПП
125644$:JSR R5,125560$ ; Чтение МП
.WORD 5
CLRB @#23334 ; Код возврата = 0
CMP R5,#32 ; Тип устройства = 32 ?
BNE 125720$ ; Нет
MOVB @#23335,R0 ; R0 = код функции
MOV R0,R5
ASH #-3,R0
CMP R0,#3 ; Код функции в пределах 0 - 37 ?
BHI 125720$ ; Нет
ASL R0
ADD R0,PC ; Переход по соответствующему адресу
BR 125730$ ; Запрос и освобождение блоков памяти
BR 126024$ ; Чтение памяти ПП
BR 126050$ ; Запись в память ПП
BR 126074$ ; Запуск п/п пользователя
125720$:JMP 125162$
125724$:JMP 125154$
; Запрос и освобождение блоков памяти
125730$:MOV @#23340,R1 ; R1 = начальный адрес в памяти ПП
MOV @#23342,R0 ; R0 = размер блока в словах
ASL R0
ASR R5 ; Функция запроса блока памяти ?
BCC 126012$ ; Нет
CALL 176132$ ; Запросить область памяти
ASR R0
CMP R0,@#23342 ; Полученное значение >= запрошенного ?
BHIS 125770$ ; Да
MOVB #377,@#23334 ; Код возврата = 377 (мало памяти)
125770$:MOV R0,@#23342 ; Возвратить объем полученной памяти
MOV R1,@#23340 ; Возвратить адрес блока
JSR R5,125612$ ; Записать МП в ОЗУ ЦП
.WORD 4
JMP 125154$
126012$:CALL 176300$ ; Освободить блок памяти
BMI 125720$
JMP 125140$
; Чтение памяти ПП
126024$:CALL 126110$ ; Получение адресов ЦП, ПП и числа слов
BEQ 125720$ ; Число слов равно нулю
BR 126040$
126034$:INC @#177010 ; Цикл чтения
126040$:MOV (R1)+,@#177014
SOB R0,126034$
BR 125724$
; Запись в память ПП
126050$:CALL 126110$ ; Получение адресов ЦП, ПП и числа слов
BEQ 125720$ ; Число слов равно нулю
BR 126064$
126060$:INC @#177010 ; Цикл записи
126064$:MOV @#177014,(R1)+
SOB R0,126060$
BR 125724$
; Запуск п/п пользователя
126074$:MOV @#23340,@#7140 ; Сохранение адреса запуска
INC @#7076 ; Установить флаг запуска п/п пользователя
BR 125724$
; П/п получения адресов блоков памяти ЦП, ПП и числа слов для обмена
126110$:MOV @#23340,R1 ; R1 = адрес памяти ПП
MOV @#23342,R0 ; R0 = адрес памяти ЦП
CLC
ROR R0
MOV R0,@#177010 ; Загрузка адреса в регистр адреса планов
MOV @#23344,R0 ; R0 = число слов для обмена
RETURN
; *** МАГНИТОФОН ***
; П/п установки начальных значений
126136$:CLR R0
MOV #23304,R1
MOV #14,R2
126150$:MOV R0,(R1)+ ; Очистка области ОЗУ п/п работы с магнитофоном
SOB R2,126150$
MOV #320,23304 ; Длина бита "0"
MOV #150,23306 ; Длина бита "1"
MOV #17500,23310 ; Число битов "1" при записи пилот-тона загол.
MOV #3720,23312 ; Число битов "1" при записи пилот-тона данных
MOV #17540,23314 ; Число битов "1" при чтении пилот-тона загол.
MOV #1750,23316 ; Число битов "1" при чтении пилот-тона данных
MOV #1750,23320
MOV #64,23322 ; Разброс времени между перепадами лог. уровня
RETURN
; Основная п/п обслуживания магнитофона
126236$:JSR R5,125560$ ; Чтение массива параметров
.WORD 27
CLR R5
126246$:SOB R5,126246$ ; Задержка
MTPS #200 ; Запретить прерывания
CALL 176376$ ; Останов программируемого таймера
CALL 130672$ ; Ожидание готовности программируемого таймера
MOV #127734$,@#304 ; Настройка вектора прерывания прогр. таймера
MOV #200,@#306
MOV #130570$,@#310 ; Настройка вектора прерывания по внеш. событию
MOV #200,@#312
CLR @#177700 ; Запрет прерываний от клавиатуры
BIS #400,@#177054 ; Запрет прерываний от сет. таймера в канале ПП
BIC #200,@#177716 ; Выключить генератор звукового сигнала
BIC #107,@#177066 ; Запретить прерывания от каналов связи с ЦП
MOVB 23335,R0 ; R0 = код функции
BIC #177600,R0
ASL R0
CALL @126502$(R0) ; Вызов соответствующей п/п
MOVB R0,23334 ; Код возврата
BIC #14,@#177716 ; Запрет приема информации по линии вн. событие
CALL 130672$
MOV 23200,R4 ; R4 = адрес МП в ОЗУ ЦП
ADD #14,R4
MOV R4,@#177010
MOV #23364,R4 ; R4 = адрес МП в ОЗУ ПП (имя прочит. файла)
MOV #13,R2
126422$:MOV (R4)+,@#177014 ; Пересылка
INC @#177010
SOB R2,126422$
BIC #400,@#177054 ; Разрешить прерывания от таймера в канале ПП
MOV #100,@#177700 ; Разрешить прерывания от клавиатуры
BIS #200,@#177716 ; Включить генератор звукового сигнала
BIS #107,@#177066 ; Разрешить прерывания от каналов связи с ЦП
CALL 125140$ ; Переслать код возврата в ОЗУ ЦП
CALL 176422$ ; Запрет прерываний от прогр. таймера
MTPS #0 ; Разрешить прерывания
RETURN
; Адреса п/п обслуживания работы с магнитофоном
126502$:.WORD 126546$,126554$,126632$,126546$
.WORD 126546$,126546$,126546$,126546$
.WORD 127102$,127110$,126546$,126546$
.WORD 127116$,127132$,127044$,126546$
.WORD 126714$,126662$
126546$:MOV #10,R0 ; R0 = код возврата (неверный код функции)
RETURN
; П/п установки параметров одинарной плотности записи
126554$:MOV #320,23304 ; Длина бита "0"
MOV #150,23306 ; Длина бита "1"
MOV #17500,23310 ; Число битов "1" перед заголовком
MOV #3720,23312 ; Число битов "1" перед зоной данных
MOV #17540,23314 ; Число перепадов уровня при чтении (загол.)
MOV #1750,23316 ; Число перепадов уровня при чтении (данные)
MOV #1750,23320
CLR R0
RETURN
; П/п установки параметров двойной плотности записи
126632$:MOV #150,23304 ; Длина бита "0"
MOV #64,23306 ; Длина бита "1"
NOP
MOV #3720,23320
CLR R0
RETURN
; П/п записи блока данных на магнитную ленту
126662$:MOV SP,23332 ; Сохранить значение указателя стека
MOV 23360,R4 ; R4 = адрес буфера в ОЗУ ЦП
CLC
ROR R4
MOV R4,@#177010
CALL 127476$ ; Подготовка и пуск программируемого таймера
MOV #200,R2 ; R2 = число записываемых слов
BR 126776$
; П/п записи файла с заголовком
126714$:MOV SP,23332 ; Сохранить значение указателя стека
MOV 23360,R4 ; R4 = адрес буфера в ОЗУ ЦП
CLC
ROR R4
MOV R4,@#177010
CALL 127476$ ; Подготовка и пуск программируемого таймера
CALL 127536$ ; Запись пилот-тона перед заголовком
CALL 127560$ ; Запись имени файла
MOV 23362,R0 ; R0 = число записываемых слов
MOV R0,R2 ; R2 = число записываемых слов
TST R2 ; Оно равно нулю ?
BEQ 127040$
CALL 127602$ ; Запись числа слов в файл
MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП
CALL 127602$ ; Запись адреса буфера в файл
126776$:CALL 127544$ ; Запись пилот-тона перед зоной данных
CLR R4 ; Контрольная сумма = 0
127004$:MOV @#177014,R0 ; R0 = слово данных
INC @#177010 ; Переход к следующему адресу
ADD R0,R4 ; Подсчет контрольной суммы файла
ADC R4
CALL 127602$ ; Запись слова данных
SOB R2,127004$ ; Цикл по R2 (число записываемых слов)
MOV R4,R0 ; R0 = контрольная сумма
CALL 127602$ ; Запись контрольной суммы
CALL 127664$ ; Запись бита "1"
127040$:CLR R0
RETURN
; П/п чтения блока данных
127044$:MOV SP,23332 ; Сохранить значение указателя стека
MOV #200,R2 ; R2 = число считываемых слов
MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП
CLC
ROR R0
MOV R0,@#177010
CALL 130020$ ; Подготовка и пуск программируемого таймера
CALL 130156$ ; Поиск пилот-тона перед зоной данных
BR 127372$
; Точка входа при чтении файла с заголовком
127102$:CLR 23330 ; Признак реального чтения файла
BR 127124$
; Точка входа при чтении файла с пропуском заголовка
127110$:CLR 23330 ; Признак реального чтения файла
BR 127140$
; Точка входа при фиктивном чтении файла с заголовком
127116$:MOV #4,23330 ; Признак фиктивного чтения
127124$:CLR 23326 ; Признак проверки заголовка
BR 127146$
; Точка входа при фиктивном чтении файла с пропуском заголовка
127132$:MOV #4,23330 ; Признак фиктивного чтения
127140$:MOV #22,23326 ; Признак пропуска заголовка
127146$:MOV SP,23332 ; Сохранить значение указателя стека
CALL 130020$ ; Подготовка и пуск программируемого таймера
CALL 130060$ ; Поиск пилот-тона перед заголовком
CALL 130254$ ; Автоподстройка по пилот-тону
CALL 130372$ ; Чтение заголовка
BIT #1,R1 ; Тип устройства ?
BEQ 127220$ ; MSX
CALL 130436$ ; Чтение длины файла в словах
MOV R0,23406 ; Сохранить ее в МП
CALL 130436$ ; Чтение адреса загрузки файла
MOV R0,23404 ; Сохранить его в МП
127220$:MOV 23320,R3
ADD 23326,PC ; Пропустить проверку заголовка (на 127252$)?
MOV #10,R2 ; R2 = длина заголовка в словах
MOV #23364,R4 ; R4 = адрес прочитанного заголовка
MOV #23340,R0 ; R0 = адрес заданного заголовка
127244$:CMP (R0)+,(R4)+ ; Цикл сравнения
BNE 127462$ ; Не равны
SOB R2,127244$
127252$:BIT #1,R1 ; Тип устройства ?
BNE 127312 ; УКНЦ
MOV #200,R2 ; R2 = число записываемых слов
MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП
CLC
ROR R0
MOV R0,@#177010
MOV #10,R3
CALL 130156$ ; Поиск пилот-тона перед зоной данных
BR 127372$
127312$:MOV 23362,R0 ; R0 = число считываемых слов
TST R0 ; Оно превышает 32767 ?
BMI 127330$ ; Да
CMP 23406,R0 ; Число запрошенных слов превышает длину файла?
BHI 127334$ ; Нет
127330$:MOV 23406,R0 ; Используем длину файла
127334$:MOV R0,R2 ; R2 = число считываемых слов
MOV 23404,23410
MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП
CLC
ROR R0
BCC 127366$ ; Четный адрес
MOV 23404,R0 ; Используется считанный адрес
CLC
ROR R0
127366$:MOV R0,@#177010
127372$:TST R2 ; Число считываемых слов равно нулю ?
BEQ 127452$ ; Да
CLR R4 ; Контрольная сумма = 0
CALL 130336$ ; Поиск и чтение первого слова данных
BR 127412$
127406$:CALL 130436$ ; Чтение слова
127412$:ADD 23330,PC ; Фиктивное чтение (на 127422$) ?
MOV R0,@#177014 ; Пересылка в ОЗУ ЦП
127422$:INC @#177010 ; Переход к следующему адресу
ADD R0,R4 ; Подсчет контрольной суммы
ADC R4
SOB R2,127406$
BIT #1,R1 ; Тип устройства
BEQ 127452$ ; MSX
CALL 130436$ ; Чтение контрольной суммы
CMP R0,R4 ; Считанная КС равна подсчитанной ?
BNE 127470$
127452$:CLR R0
127454$:MTPS #200
RETURN
127462$:MOV #1,R0 ; R0 = не совпадает заголовок
BR 127454$
127470$:MOV #12,R0 ; R0 = не совпадает контрольная сумма
BR 127454$
; П/п начальной подготовки перед записью
127476$:BIC #14,@#177716 ; Блокировка приема информации с МЛ
CLR @#177712 ; Очистить счетчик прогр. таймера
127510$:TST @#177714 ; Счетчик очищен ?
BNE 127510$ ; Нет
MOV #101,@#177710 ; Пуск таймера и разрешение прерываний
MOV #4,R3 ; R3 = число записываемых импульсов
MTPS #0 ; Разрешить прерывания
RETURN
; Точка входа при записи пилот-тона перед заголовком
127536$:MOV 23310,R4 ; R4 = число битов "1" в пилот-тоне
BR 127550$
127544$:MOV 23312,R4 ; R4 = число "1" в пилот-тоне перед данными
127550$:CALL 127664$ ; Запись бита "1"
SOB R4,127550$ ; Цикл по R4
RETURN
; П/п записи имени файла
127560$:MOV #10,R2 ; R2 = размер имени файла в словах
MOV #23340,R4 ; R4 = адрес начала имени файла
127570$:MOV (R4)+,R0 ; R0 = очередное слово из имени файла
CALL 127602$ ; Запись слова
SOB R2,127570$ ; Цикл по R2
RETURN
; П/п записи слова на МЛ
127602$:CALL 127616$ ; Запись младшего байта
SWAB R0
CALL 127616$ ; Запись старшего байта
RETURN
; П/п записи байта на МЛ
; /-----------------------------------------------------------------\
; ! СТРУКТУРА БАЙТА ПРИ ЗАПИСИ НА МЛ !
; ! !
; ! бит "0", информационные биты (0) -- (7), бит "1", бит "1" !
; \-----------------------------------------------------------------/
127616$:CALL 127660$ ; Запись бита "0"
SEC ; Признак окончания байта
127624$:RORB R0 ; Выдвинуть очередной бит
BEQ 127646$ ; Байт окончился
BCC 127640$ ; Выдвинут бит "0"
CALL 127664$ ; Запись бита "1"
BR 127624$
127640$:CALL 127660$ ; Запись бита "0"
BR 127624$
127646$:CALL 127664$ ; Запись концевика (два бита "1")
CALL 127664$
RETURN
; Точка входа при записи бита "0"
127660$:CLR R5 ; Признак записи бита "0"
BR 127670$
; Точка входа при записи бита "1"
127664$:MOV #14,R5 ; Признак записи бита "1"
127670$:CALL 130636$ ; Проверка нажатия "СТОП"
TST R3 ; Запись бита окончена ?
BNE 127670$ ; Нет
ADD R5,PC ; Если запись "1", на 127716$
MOV 23304,@#177712 ; Занести длительность "0" в буфер таймера
MOV #2,R3 ; R3 = число записываемых импульсов
BR 127730$
127716$:MOV 23306,@#177712 ; Занести длительность "1" в буфер таймера
MOV #4,R3 ; R3 = число записываемых импульсов
127730$:CLC
RETURN
; П/п обработки прерывания от программируемого таймера
127734$:BIS #2,@#177716 ; Установить высокий уровень при записи на МЛ
MOV #127752$,@#304 ; Новое значения вектора прерывания
BR 127766$
127752$:BIC #2,@#177716 ; Установить низкий уровень при записи на МЛ
MOV #127734$,@#304 ; Новое значение вектора прерывания
127766$:TST @#177714 ; Сбросить готовность таймера
TSTB @#177710 ; Готовность сброшена ?
BMI 127766$ ; Нет
DEC R3 ; Уменьшить счетчик записываемых импульсов
BMI 130006$ ; Он отрицательный
RTI
130006$:MOV #14,R0 ; R0 = ошибка выдержки времени при записи
MOV 23332,SP
RETURN
; П/п начальной подготовки перед чтением
130020$:CLR @#177710 ; Остановить программируемый таймер
MOV 23336,R1 ; R1 = тип устройства (УКНЦ или MSX)
CLR @#177712 ; Очистить буфер таймера
130034$:TST @#177714 ; Буфер очищен ?
BNE 130034$ ; Нет
BIS #14,@#177716 ; Разрешить прием информации с МЛ
MOV #21,@#177710 ; Пуск таймера и разрешение прерывания при
; изменении информации на линии МЛ
RETURN
; П/п поиска пилот-тона перед заголовком
130060$:MTPS #200 ; Запретить прерывания
130064$:MOV 23314,R2 ; R2 = число перепадов уровня при поиске загол.
130070$:MOV R5,R4 ; R4 = длина предыдущего интервала
130072$:CALL 130636$ ; Проверка нажатия "СТОП"
BIT #40,@#177710 ; Перепад произошел ?
BEQ 130072$ ; Нет
MOV @#177714,R5 ; R5 = длина текущего интервала
130112$:TST @#177714 ; Сбросить готовность таймера
BIT #250,@#177710 ; Готовность сброшена ?
BNE 130112$ ; Нет
SUB R5,R4 ; Вычислить разность между длинами интервалов
BPL 130134$
NEG R4
130134$:CMP R4,23322 ; Разброс длин в норме ?
BHI 130064$ ; Нет
SOB R2,130070$ ; Цикл по R2
MOV #10,R3
MTPS #0
RETURN
; П/п поиска пилот-тона перед зоной данных
130156$:MTPS #200 ; Запретить прерывания
130162$:MOV 23316,R0 ; R0 = число перепадов уровня при поиске загол.
130166$:MOV R5,R4 ; R4 = длина предыдущего интервала
130170$:CALL 130636$ ; Проверка нажатия "СТОП"
BIT #40,@#177710 ; Перепад произошел ?
BEQ 130170$ ; Нет
MOV @#177714,R5 ; R5 = длина текущего интервала
130210$:TST @#177714 ; Сбросить готовность таймера
BIT #250,@#177710 ; Готовность сброшена ?
BNE 130210$ ; Нет
SUB R5,R4 ; Вычислить разность между длинами интервалов
BPL 130232$
NEG R4
130232$:CMP R4,23322 ; Разброс длин в норме ?
BHI 130162$ ; Нет
SOB R0,130166$ ; Цикл по R0
MOV #10,R3
MTPS #0
RETURN
; П/п вычисления усредненного значения длины бита (между "0" и "1")
130254$:MOV R1,R4 ; Сохранить значение R1 в R4
MOV #10,R0 ; R0 = число читаемых импульсов
CLR R1
CLR R3
130266$:CALL 130530$ ; Чтение бита
BIS #170000,R5 ; Преобразование в отрицательное число
SUB R5,R1 ; Прибавить к общей длине
SOB R0,130266$ ; Цикл по R0
MOV #10,R3
DIV #10,R0 ; Вычисление среднего значения длины "1"
MOV R0,R1 ; R1 = длина "1"
ASR R0 ; R0 = длина "1" / 2
ADD R1,R0 ; R0 = среднее между длиной "1" и "0"
NEG R0 ; Преобразование в отрицательное число (12 бит)
BIC #170000,R0
MOV R0,23324 ; Сохранение его в памяти
MOV R4,R1 ; Восстановление R1
RETURN
; П/п поиска данных (определяются по биту "0")
130336$:CLR R5 ; Очередной бит не прочитан
130340$:CALL 130636$ ; Проверка нажатия "СТОП"
TST R5 ; Бит прочитан ?
BEQ 130340$ ; Нет
INC R3 ; Увеличить счетчик импульсов
CMP R5,23324 ; Это бит "0" ?
BHIS 130336$ ; Нет
INC R3
INC R3
CALL 130422$ ; Дочитать слово
RETURN
; П/п чтения имени файла
130372$:MOV #10,R2 ; R2 = длина имени файла в словах
MOV #23364,R4 ; R4 = адрес буфера
CALL 130336$ ; Поиск и чтение первого слова
BR 130414$
130410$:CALL 130436$ ; Чтение очередного слова
130414$:MOV R0,(R4)+ ; Поместить в буфер
SOB R2,130410$ ; Цикл по R2
RETURN
; П/п дочитывания слова
130422$:CLRB R0
BIS #200,R0 ; Признак окончания чтения байта
CALL 130470$ ; Дочитать байт
BR 130442$
; П/п чтения слова
130436$:CALL 130454$ ; Прочесть младший байт
130442$:SWAB R0
CALL 130454$ ; Прочесть старший байт
SWAB R0
RETURN
; П/п чтения байта
130454$:CLRB R0
BIS #200,R0 ; Установить признак окончания
CALL 130530$ ; Прочесть бит
BCS 130516$ ; Это не "0" (ошибка)
130470$:CALL 130530$ ; Прочесть бит
RORB R0 ; "Задвинуть" бит
BCC 130470$ ; Пока не конец
CALL 130530$ ; Прочесть бит
BCC 130516$ ; Это не "1" (ошибка)
CALL 130530$ ; Прочесть бит
BCC 130516$ ; Это не "1" (ошибка)
RETURN
130516$:MOV #11,R0 ; R0 = ошибка чтения
MOV 23332,SP
RETURN
; П/п чтения бита
130530$:CLR R5 ; Бит еще не прочитан
130532$:CALL 130636$ ; Проверка нажатия "СТОП"
TST R5 ; Бит прочитан ?
BEQ 130532$ ; Нет
CMP R5,23324 ; Это "0" ?
BLO 130560$ ; Да
MOV #3,R3
SEC ; Признак бита "1"
BR 130566$
130560$:MOV #1,R3
CLC ; Признак бита "0"
130566$:RETURN
; П/п обработки прерывания по линии МЛ при изменении уровня сигнала
130570$:TST R3 ; Счетчик равен нулю ?
BNE 130604$ ; Нет
TST R5 ; Обработка предыдущего бита окончена ?
BNE 130624$ ; Нет
MOV @#177714,R5 ; R5 = длина импульса
130604$:TST @#177714 ; Сбросить готовность таймера
BIT #250,@#177710 ; Готовность сброшена ?
BNE 130604$ ; Нет
DEC R3 ; Уменьшить счетчик импульсов
RTI
130624$:MOV #13,R0 ; R0 = ошибка выдержки времени при чтении
MOV 23332,SP
RETURN
; П/п проверки нажатия клавиши "СТОП"
130636$:TSTB @#177700 ; Клавиша нажата ?
BPL 130670$ ; Нет
CMP #4,@#177702 ; Это "СТОП" ?
BNE 130670$ ; Нет
MOV 23332,SP
MOV #377,R0 ; R0 = нажата клавиша "СТОП"
MTPS #200 ; Запретить прерывания
130670$:RETURN
; П/п выключения программируемого таймера
130672$:CLR @#177710 ; Выключить таймер (режим "ОСТАНОВ")
TST @#177714 ; Сбросить готовность таймера
TST @#177710 ; Готовность сброшена ?
BNE 130672$ ; Нет
RETURN
; *** ДИСКОВОД ***
; П/п установки начальных значений
130712$:TST @#177132 ; Проверка присутствия контроллера дисковода
CLR 23204 ; Очистить управляющее слово
MOV 23204,@#177130 ; Инициализация контроллера
CLRB 23334
CLR 23220
CLR 23222
BIT #10000,@#177704; Подключен 80-дорожечный дисковод ?
BEQ 131030$ ; Нет
; Параметры для 80-дорожечного дисковода
MOV #620,23216 ; Время разгона двигателя
MOV #23260,R1 ; R1 = адрес буфера времен шага
MOV #3,R0 ; R0 = время шага
CALL 131164$ ; Установить для всех четырех накопителей
MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки
MOV #44,R0 ; R0 = время загрузки головки
CALL 131164$ ; Установить для всех четырех накопителей
MOVB #50,23226 ; Номер дорожки, где вкл. прекоррекция 250 нс
MOVB #120,23227 ; Номер дорожки, где вкл. прекоррекция 500 нс
BR 131102$
; Параметры для 40-дорожечного дисковода
131030$:MOV #1750,23216 ; Время разгона двигателя
MOV #23260,R1 ; R1 = адрес буфера времен шага
MOV #24,R0 ; R0 = время шага
CALL 131164$ ; Установить для всех четырех накопителей
MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки
MOV #50,R0 ; R0 = время загрузки головки
CALL 131164$ ; Установить для всех четырех накопителей
MOVB #10,23226 ; Номер дорожки, где вкл. прекоррекция 250 нс
MOVB #36,23227 ; Номер дорожки, где вкл. прекоррекция 500 нс
131102$:MOV #23270,R1 ; R1 = адрес буфера числа секторов в дорожке
MOV #12,R0 ; R0 = число секторов в дорожке
CALL 131164$ ; Установить для всех четырех накопителей
MOV #23274,R1 ; R1 = адрес буфера параметров SKIP (REGIM)
MOV #1,R0 ; R0 = параметр SKIP
CALL 131164$ ; Установить для всех четырех накопителей
MOV #2,23250 ; Текущий формат сектора - 512 байт
MOV #-1,23337
MOV #-1,23254 ; Неопределенный номер текущих дорожек
MOV #-1,23256
RETURN
131164$:MOV #4,R2 ; R2 = максимальное число накопителей
131170$:MOVB R0,(R1)+ ; Установить параметр
SOB R2,131170$
RETURN
; Основная п/п управления накопителем
131176$:JSR R5,125560$ ; Чтение МП
.WORD 5
CALL 176376$ ; Останов программируемого таймера
JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п
.WORD 10,131224$,107 ; по адресу 131224$
RETURN
131224$:CALL 134242$ ; Сброс готовности программируемого таймера
CLRB @#177710 ; Перевести таймер в режим "ОСТАНОВ"
CALL 134316$ ; Сохранить значения РОН
BIC #175754,23204 ; Сброс в УС прекоррекции,номера стороны ...
BICB #300,23335 ; Очистка старших битов кода функции
BEQ 131516$ ; Код функции = 0 (ошибка)
CMPB #10,23335 ; Код функции >= 10(8) ?
BLOS 131272$ ; Да
JMP 135214$ ; Код функции в пределе 1 -- 7
131272$:TSTB 23337 ; Какая сторона запрошена ?
BPL 131316$ ; Низ
BIS #40,23204 ; Установить "ВЕРХ" в УС
MOVB #1,23212 ; Текущая сторона - верх
BR 131330$
131316$:BIC #40,23204 ; Установить "НИЗ" в УС
CLRB 23212 ; Текущая сторона - низ
131330$:BICB #374,23337 ; Оставить биты номера устройства
MOVB 23340,23213 ; Переслать номер запрашиваемой дорожки
CLR R1
MOVB 23337,R1 ; R1 = номер устройства
MOVB 23260(R1),23220; Текущее время шага
MOVB 23264(R1),23222; Текущее время загрузки головки
MOVB 23274(R1),23300; Текущий параметр SKIP
MOVB 23270(R1),23301; Текущее число секторов в дорожке
TSTB 23341 ; Номер запрашиваемого сектора отрицательный ?
BMI 131516$ ; Да
CMPB 23341,23301 ; Номер сектора превышает лимит ?
BHI 131516$ ; Да
CMPB #5,23301 ; В дорожке 5 секторов ?
BEQ 131440$ ; Да
MOV #2,23250 ; Текущий формат сектора - 512 байт
BR 131446$
131440$:MOV #3,23250 ; Текущий формат сектора - 1024 байт
131446$:MOV 23250,R0 ; R0 = текущий формат сектора
MOVB 135426$(R0),23302; (23302) = размер межсекторного промежутка
ASL R0
MOV 135412$(R0),23252; (23252) = число слов в секторе
CMPB #30,23335 ; Код функции < 30
BHI 131502$ ; Да
BR 131542$
131502$:CLC ; Преобразование адреса для загрузки в 177010
ROR 23342
MOV 23344,R0 ; R0 = число слов для чтения
BPL 131530$ ; Оно < 32768 (в норме)
131516$:MOVB #11,23334 ; Ошибочный массив параметров
JMP 134422$
131530$:ADD 23342,R0 ; R0 = число слов + начальный адрес
CMP #70000,R0 ; Конец буфера выходит за границу 56 KB ?
BLO 131516$ ; Да
131542$:MOVB 23337,R1 ; R1 = номер устройства
MOV R1,23206
ADD #23254,23206 ; (23206) = указатель на текущую дорожку
JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п
.WORD 101,131710$,107; по адресу 131710$
BIT #2000,23204 ; Двигатель накопителя еще работает ?
BNE 131620$ ; Да
BIS #20,23204 ; Установить бит запуска мотора в УС
MOV 23216,23224 ; (23224) = время разгона двигателя
BR 131652$
131620$:MOVB 23204,R0
BICB #374,R0 ; R0 = номер выбранного устройства
CMPB 135406$(R1),R0 ; Номера выбранного и запрошенного уст-в равны?
BNE 131644$ ; Нет
CALL 134356$ ; Восстановить РОН
BR 131726$
131644$:MOV 23222,23224 ; (23224) = время загрузки головки
131652$:BIC #3,23204
BISB 135406$(R1),23204; Установить биты номера устройства в УС
BIS #2000,23204 ; Установить бит выбора накопителя
MOV 23204,@#177130 ; Запуск мотора
CALL 134356$ ; Восстановить РОН
RTI
131710$:CALL 134242$ ; Сброс готовности программируемого таймера
DEC 23224 ; Уменьшить значение счетчика (разгон мотора)
BNE 131724$ ; Он еще не равен нулю
BR 131726$
131724$:RTI
131726$:JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п
.WORD 101,132074$,107; по адресу 132074$
TSTB @23206 ; Текущий номер дорожки определенный ?
BPL 132112$ ; Да
MOVB #200,@23206 ; Примем в качестве номера дорожки - 128
BIC #100,23204 ; Установить в УС перемещение от центра
MOV 23204,@#177130 ; Сообщить об этом контроллеру
BIS #200,23204 ; Установить в УС бит шага
131776$:BIT #1,@#177130 ; Головка находится на нулевой дорожке ?
BEQ 132022$ ; Нет
BIC #200,23204 ; Сбросить в УС бит шага
CLRB @23206 ; Текущая дорожка - нулевая
BR 132112$
132022$:DECB @23206 ; Уменьшить номер текущей дорожки
BNE 132056$ ; Пока не 0
BIC #200,23204 ; Сбросить в УС бит шага
MOVB #377,@23206 ; Номер дорожки - неопределенный
MOVB #7,23334 ; Ошибка - нулевая дорожка не обнаружена
JMP 134422$
132056$:MOV 23204,@#177130 ; Сделать шаг назад
MOV 23220,23224 ; (23224) = время шага
RTI
132074$:CALL 134242$ ; Сбросить готовность программируемого таймера
DEC 23224 ; Уменьшить значение счетчика (время шага)
BNE 132110$ ; Он не равен нулю
BR 131776$
132110$:RTI
132112$:CMPB @23206,23340 ; Сравнить номера текущей и запрошенной дорожек
BEQ 132346$ ; Равны
BHI 132164$ ; Больше
INCB @23206 ; Увеличить номер текущей дорожки
BMI 132152$ ; Он > 127 (ошибка)
BIT #100,23204 ; В УС установлен бит перемещения к центру
BNE 132246$ ; Да
BIS #100,23204 ; Установить в УС бит перемещения к центру
BR 132224$
132152$:MOVB #10,23334 ; Ошибка - дорожка не обнаружена
JMP 134422$
132164$:DECB @23206 ; Уменьшить номер текущей дорожки
BIT #1,@#177130 ; Головка находится на нулевой дорожке ?
BEQ 132206$ ; Нет
CLRB @23206 ; Текущая дорожка - нулевая
BR 132112$
132206$:BIT #100,23204 ; В УС сброшен бит перемещения
BEQ 132246$ ; Да
BIC #100,23204 ; Сбросить в УС бит перемещения
132224$:MOV 23204,@#177130 ; Извещение контроллера о направлении перемещ.
MOV #132242$,@#304 ; Адрес новой п/п обработки прерывания
RTI
132242$:CALL 134242$ ; Сбросить готовность программируемого таймера
132246$:MOVB 23300,23246 ; (23246) = текущий параметр SKIP
132254$:MOV 23220,23224 ; (23224) = время шага
MOV #132322$,@#304 ; Адрес новой п/п обработки прерывания
CALL 132276$ ; Выполнить шаг в выбранном направлении
RTI
132276$:BIS #200,23204 ; Установить в УС бит шага
MOV 23204,@#177130 ; Выполнить шаг
BIC #200,23204 ; Сбросить в УС бит шага
RETURN
132322$:CALL 134242$ ; Сбросить готовность программируемого таймера
DEC 23224 ; Уменьшить значение счетчика (время шага)
BNE 132344$ ; Он не равен нулю
DECB 23246 ; Уменьшить параметр пропуска дорожки
BNE 132254$ ; Не равен нулю
BR 132112$
132344$:RTI
132346$:BIC #14,23204 ; Очистить в УС биты прекоррекции
MOV 23226,23246 ; (23246) = номера дорожек, где вкл. прекорр.
CMPB #1,23300 ; Параметр SKIP равен 1 ?
BEQ 132402$ ; Да
ASRB 23246 ; Уменьшить номера дорожек на 2
ASRB 23247
132402$:CMPB 23246,@23206 ; Надо включать прекоррекцию ?
BHI 132440$ ; Нет
CMPB 23247,@23206 ; Включать прекоррекцию 500 нс ?
BHI 132432$ ; Да
BIS #4,23204 ; Установить в УС бит вкл. прекоррекции 250 нс
BR 132440$
132432$:BIS #10,23204 ; Установить в УС бит вкл. прекоррекции 500 нс
132440$:MOV 23204,@#177130 ; Извещение контроллера о вкл. прекоррекции
MOV #132456$,@#304 ; Адрес новой п/п обработки прерывания
RTI
132456$:CALL 134242$ ; Сбросить готовность программируемого таймера
CLRB @#177710 ; Остановить таймер
CALL 134316$ ; Сохранить значения РОН
MOV #177130,R4 ; R4 = адрес РСУ накопителя
MOV R4,R5
TST (R5)+ ; R5 = адрес РД накопителя
CMPB #10,23335 ; Запрошено чтение ?
BEQ 132570$ ; Да
BIT #4,@R4 ; Дискета защищена от записи ?
BEQ 132532$ ; Нет
MOVB #6,23334 ; Ошибка - защита от записи
JMP 134422$
132532$:CMPB #20,23335 ; Запрошена запись ?
BEQ 132570$
CMPB #30,23335 ; Запрошено форматирование дорожки ?
BNE 132556$ ; Нет
JMP 134474$
132556$:MOVB #11,23334 ; Ошибка - неверный массив параметров
JMP 134422$
132570$:MOV #36,23224
MOV 23224,R2
MOV 23204,R3 ; R3 = УС
MOV #177130,R4 ; R4 = адрес РСУ накопителя
MOV R4,R5
TST (R5)+ ; R5 = адрес РД накопителя
JSR R5,134210$ ; Запуск таймера
.WORD 2465,132630$,7
132630$:MOV @R5,R0 ; Прочесть слово с дискеты
BEQ 132640$ ; Это нуль
INC R0
BNE 132656$ ; Это не минус один
132640$:TSTB @#177710 ; Таймер окончил счет ?
BPL 132630$ ; Нет
CALL 134242$ ; Сбросить готовность таймера
SOB R2,132630$
BR 132772$ ; Ошибка (не форматирована дискета или ее нет)
132656$:MOV #4,R1
CMPB #5,23301 ; Формат 1024 байта в секторе ?
BNE 132702$ ; Нет
TST @R4 ; Присутствует линия индекс ?
BPL 132702$ ; Нет
MOV #36,R1
132702$:MOV @R5,R0 ; Прочесть слово с дискеты
BEQ 132730$ ; Это нуль
INC R0
BEQ 132730$ ; Это минус один
TSTB @#177710 ; Таймер окончил счет
BPL 132656$ ; Нет
CALL 134242$ ; Сбросить готовность таймера
SOB R2,132656$
BR 133002$ ; Ошибка (не найден межсекторный промежуток)
132730$:MOV @R5,R0 ; Прочесть слово с дискеты
BEQ 132740$ ; Это нуль
INC R0
BNE 132640$ ; Это не минус один
132740$:SOB R1,132730$
BIS #400,R3 ; Установить в УС бит поиска заголовка
MOV R3,@R4 ; Начать поиск
BIC #400,R3 ; Сбросить в УС бит поиска заголовка
MOV #226,R0 ; Время ожидания поиска
MOV R3,@R4
132762$:TSTB @R4 ; Маркер заголовка обнаружен ?
BMI 133034$ ; Да
SOB R0,132762$
BR 132630$ ; Заголовок сектора необнаружен
132772$:MOVB #100,23334 ; Ошибка - не форматирована дискета
BR 133030$
133002$:MOVB #101,23334 ; Ошибка - не обнаружен межсекторный промежуток
BR 133030$
133012$:MOVB #102,23334 ; Ошибка - не найден сектор с заданным номером
BR 133030$
133022$:MOVB #3,23334
133030$:JMP 134422$
133034$:TST @R5 ; Сбросить готовность контроллера дисковода
133036$:TSTB @R4 ; Следующее слово прочитано ?
BPL 133036$ ; Нет
CMP #120776,@R5 ; Это адресный маркер заголовка сектора?
BEQ 133212$ ; Да
MOV #14,R0
133054$:ADD 23252,R0
ASL R0
ASL R0
133064$:CLRB @#177710
MOV R0,@#177712 ; Загрузить буфер таймера
CMP R0,@#177714 ; Буфер загружен ?
BNE 133064$ ; Нет
MOV #133134$,@#304 ; Адрес новой п/п обработки прерываний
MOVB #107,@#177710 ; Запустить таймер
MOV R3,23204
MOV R2,23224
CALL 134356$ ; Восстановить РОН
RTI
133134$:CALL 134242$ ; Сбросить готовность таймера
CALL 134316$ ; Сохранить содержимое РОН
DEC 23224 ; Уменьшить счетчик (число оборотов диска)
BLE 133012$ ; Он равен нулю (ошибка)
MOV #2465,@#177712 ; Загрузить буфер таймера временем оборота
MOV #7,@#177710 ; Перевести таймер в режим "ПУСК" (без прерыв.)
MOV 23224,R2 ; R2 = значение счетчика
MOV 23204,R3 ; R3 = УС
MOV #177130,R4 ; R4 = адрес РСУ накопителя
MOV R4,R5
TST (R5)+ ; R5 = адрес РД накопителя
JMP 134100$ ; На поиск заголовка сектора
133212$:TSTB @R4 ; Очередное слово сформировано ?
BPL 133212$ ; Нет
MOV @R5,23246 ; Прочесть его
CMP 23212,23246 ; Это идентификатор стороны и дорожки ?
BEQ 133276$ ; Да
133232$:TSTB @R4 ; Очередное слово сформировано ?
BPL 133232$ ; Нет
TST @R5 ; Игнорировать прочитанное слово(номер сектора)
CALL 134300$ ; Контрольная сумма в порядке ?
BEQ 133270$ ; Нет
MOV R3,23204 ; Сохранить УС
CALL 134356$ ; Восстановить РОН
MOVB #377,@23206 ; Поставить номер неопределенной дорожки
JMP 131726$
133270$:MOV #40,R0
BR 133054$
133276$:TSTB @R4 ; Очередное слово сформировано ?
BPL 133276$ ; Нет
MOV @R5,R0 ; R0 = прочитанное слово
SWAB R0
CMPB 23341,R0 ; Номер сектора совпадает ?
BNE 133270$ ; Нет
MOV 23344,R2 ; R2 = число слов для обмена
MOV 23342,@#177010 ; Адрес буфера ОЗУ ЦП
CALL 134300$ ; Контрольная сумма в порядке ?
BNE 133344$ ; Да
MOVB #2,23334 ; Ошибка в контрольной сумме заголовка
BR 133030$
133344$:CMPB #10,23335 ; Задана операция чтения ?
BNE 133506$ ; Нет
TST @R5 ; Сбросить готовность контроллера
MOV #21,R1
CALL 134132$ ; Поиск пропуска синхроимпульсов
BEQ 133476$ ; Не найдено
133370$:TSTB @R4 ; Очередное слово сформировано ?
BPL 133370$ ; Нет
CMP #120773,@R5 ; Это маркер данных ?
BNE 133476$ ; Нет
MOV 23252,R1 ; R1 = число слов в секторе
TST R2 ; Надо прочитать 0 слов ?
BEQ 133442$ ; Да (сделать проверку КС сектора)
133412$:TSTB @R4 ; Очередное слово сформировано ?
BPL 133412$ ; Нет
MOV @R5,R0 ; Прочитать его
SWAB R0
MOV R0,@#177014 ; Переслать в ОЗУ ЦП
INC @#177010 ; Переход к следующему адресу
DEC R2 ; Уменьшить счетчик считываемых слов
BEQ 133450$ ; Все прочитали
SOB R1,133412$ ; Цикл по числу слов в секторе
BR 133452$
133442$:TSTB @R4 ; Очередное слово сформировано ?
BPL 133442$
TST @R5 ; Пропуск конца сектора
133450$:SOB R1,133442$ ; Цикл по числу слов в секторе
133452$:MOV R2,23344 ; Сохранить число оставшихся слов
CALL 134300$ ; Контрольная сумма в порядке ?
BNE 133706$ ; Да
MOVB #1,23334 ; Ошибка в контрольной сумме зоны данных
133472$:JMP 133030$
133476$:MOVB #4,23334 ; Не найден маркер данных
BR 133472$
133506$:TST R2 ; Счетчик записываемых слов равен нулю ?
BNE 133516$ ; Нет
JMP 134416$ ; Да
133516$:MOV #47116,@R5 ; Запись межсекторного промежутка
MOV #13,R0 ; R0 = размер межсекторного пром. перед данными
133526$:TSTB @R4 ; Предыдущее слово записано ?
BPL 133526$ ; Нет
MOV #47116,@R5 ; Запись межсекторного промежутка
SOB R0,133526$
MOV #6,R0 ; R0 = размер нулевой зоны
133544$:TSTB @R4 ; Очередное слово записано ?
BPL 133544$ ; Нет
MOV #0,@R5 ; Запись нулевой зоны
SOB R0,133544$
BIS #1000,R3 ; Установить бит пропуска синхроимпульсов
133562$:TSTB @R4 ; Очередное слово записано ?
BPL 133562$ ; Нет
MOV #120641,@R5 ; Запись первого слова маркера данных
MOV R3,@R4 ; Установить пропуск синхроимпульсов
BIC #1000,R3 ; Сбросить бит пропуска синхроимпульсов
133600$:TSTB @R4 ; Очередное слово записано ?
BPL 133600$ ; Нет
MOV #175641,@R5 ; Запись второго слова маркера данных
MOV 23252,R1 ; R1 = размер сектора в словах
DEC R1
133616$:TSTB @R4 ; Очередное слово записано ?
BPL 133616$
MOV @#177014,@R5 ; Запись первого слова данных
MOV R3,@R4 ; Сброс пропуска синхроимпульсов
INC @#177010 ; Переход к следующему адресу
DEC R2 ; Уменьшить счетчик записываемых слов
BEQ 133664$
133640$:TSTB @R4 ; Очередное слово записано ?
BPL 133640$ ; Нет
MOV @#177014,@R5 ; Запись данных
INC @#177010 ; Переход к следующему адресу
DEC R2 ; Уменьшить счетчик записываемых слов
BEQ 133674$
SOB R1,133640$
BR 133676$
133664$:TSTB @R4 ; Очередное слово записано ?
BPL 133664$ ; Нет
MOV #0,@R5 ; Запись нуля
133674$:SOB R1,133664$
133676$:MOV R2,23344 ; Сохранить счетчик записываемых слов
CALL 134256$ ; Запись контрольной суммы
133706$:TST 23344 ; Счетчик записываемых слов равен нулю
BNE 133720$ ; Нет
JMP 134416$ ; Да
133720$:MOV @#177010,23342 ; Сохранение регистра адреса
INCB 23341 ; Увеличить номер текущего сектора
CMPB 23341,23301 ; Он превышает номер последнего сектора ?
BLOS 134064$ ; Нет
CMPB #1,23336 ; Запрошена односторонняя операция ?
BEQ 133766$ ; Да
BIT #40,R3 ; Текущая сторона - верх ?
BNE 133766$ ; Да
INC 23212 ; Увеличить номер текущей стороны
BR 134010$
133766$:INCB 23340 ; Увеличить номер запрашиваемой дорожки
MOVB 23340,23212
SWAB 23212
CLRB 23212 ; Текущая сторона - низ
134010$:CLRB @#177710 ; Остановить программируемый таймер
TST @#177714 ; Сбросить его готовность
TST @#177714
MOVB #1,23341 ; Текущий номер сектора - 1
CMPB #1,23336 ; Запрошена односторонняя операция
BEQ 134050$ ; Да
MOV #40,R0
XOR R0,R3 ; Переменить сторону
134050$:MOV R3,23204
CALL 134356$ ; Восстановить РОН
JMP 131726$
134064$:TST @#177714 ; Сбросить готовность программируемого таймера
TST @#177714
MOV #36,R2
134100$:TST @R5 ; Перевод контроллера в режим чтения
CLR R1
MOVB 23302,R1 ; R1 = текущий размер межсекторного промежутка
ADD #6,R1
CALL 134132$ ; Поиск нулевой зоны и начала след. сектора
BEQ 134126$ ; Она не найдена
JMP 133036$
134126$:JMP 132630$
; П/п поиска нулевой зоны
134132$:TSTB @R4 ; Очередное слово считано ?
BPL 134132$ ; Нет
MOV @R5,R0
BEQ 134152$ ; Это нулевая зона
INC R0
BEQ 134152$
SOB R1,134132$
BR 134200$
134152$:BIS #400,R3 ; Уст. бит поиска пропуска синхроимпульсов
MOV R3,@R4 ; Начать поиск
BIC #400,R3 ; Сбросить бит поиска пропуска синхроимпульсов
MOV #226,R0
MOV R3,@R4
134172$:TSTB @R4 ; Поиск окончен
BMI 134204$ ; Да
SOB R0,134172$
134200$:SEZ ; Операция окончилась неуспешно
RETURN
134204$:TST @R5
RETURN
; П/п запуска таймера с вызовом п/п по его прерыванию
134210$:CLRB @#177710 ; Остановить программируемый таймер
MOV @R5,@#177712 ; Занести в буфер временную задержку
CMP @R5,@#177714
BNE 134210$
TST (R5)+
MOV (R5)+,@#304 ; Занести адрес п/п в вектор прерывания
MOV (R5)+,@#177710 ; Запустить таймер
RTS R5
; П/п сброса готовности программируемого таймера
134242$:TST @#177714 ; Сбросить готовность таймера
TSTB @#177710 ; Она сброшена ?
BMI 134242$ ; Нет
RETURN
; П/п записи контрольной суммы
134256$:BIT #40000,@R4 ; Запись КС
BEQ 134256$
MOV #47116,@R5
134270$:TSTB @R4
BPL 134270$
TST @R5
RETURN
; П/п проверки контрольной суммы
134300$:MOV #36,R0
134304$:BIT #40000,@R4 ; Проверка КС
BNE 134314$
SOB R0,134304$
134314$:RETURN
; П/п сохранения РОН
134316$:MOV R0,23232
MOV R1,23234
MOV R2,23236
MOV R3,23240
MOV R4,23242
MOV R5,23244
MOV @#177010,23230
RETURN
; П/п восстановления РОН
134356$:MOV 23232,R0
MOV 23234,R1
MOV 23236,R2
MOV 23240,R3
MOV 23242,R4
MOV 23244,R5
MOV 23230,@#177010
RETURN
; Завершающая процедура
134416$:CLRB 23334 ; Код ошибки = 0 (все нормально)
134422$:CALL 125140$ ; Переслать код возврата в ЦП
JSR R5,175400$ ; Установить адрес п/п выключения двигателя
.WORD 372,134454$
CALL 134356$ ; Восстановить РОН
CLR @#177710 ; Остановить таймер
CALL 176422$
RTI
; П/п останова двигателя
134454$:BIC #2037,23204 ; Сбросить биты выбора устройства,вкл. мотора
MOV 23204,@#177130 ; Выключить двигатель
RETURN
134472$:BR 134416$
; Форматирование дорожки
134474$:MOV 23204,R3 ; R3 = УС накопителя
MOV #177130,R4 ; R4 = адрес РУС накопителя
MOV R4,R5
TST (R5)+ ; R5 = адрес РД накопителя
SWAB 23212
MOVB 23341,R2 ; R2 = формат сектора
BIC #177774,R2
BNE 134540$
MOV #13,23334 ; Ошибка = неверный формат сектора
JMP 134422$
134540$:MOVB 135422$(R2),23246; (23246) = число секторов в дорожке
MOVB 135426$(R2),23302; (23302) = размер межсекторного промежутка
MOV R2,R1
ASL R1
MOV 135412$(R1),R1 ; R1 = число слов в секторе
SWAB R2
INC R2 ; R2 = формат сектора : номер сектора
MOV #1750,R0
134574$:TST @R4 ; Присутствует линия ИНДЕКС ?
BPL 134616$ ; Нет
SOB R0,134574$
134602$:TST @R5 ; Установить режим готовности чтения
MOVB #14,23334 ; Ошибка = ошибка линии ИНДЕКС
JMP 134422$
134616$:MOV #6200,R0 ; R0 = число слов в дорожке
MOV #47116,@R5 ; Заполнение дорожки
134626$:TST @R4 ; Присутствует линия ИНДЕКС ?
BMI 134646$
134632$:TSTB @R4 ; Предыдущее слово записано ?
BPL 134632$ ; Да
MOV #47116,@R5 ; Заполнение дорожки
SOB R0,134626$
BR 134602$
134646$:MOV #20,R0 ; R0 = размер межсект. пром. в начале дорожки
134652$:MOV #47116,@R5 ; Заполнение межсект. пром. перед заголовком
134656$:TSTB @R4 ; Очередное слово записано ?
BPL 134656$ ; Нет
MOV #47116,@R5 ; Заполнение межсект. пром. перед заголовком
SOB R0,134656$
MOV #6,R0 ; R0 = размер нулевой зоны
134674$:TSTB @R4 ; Очередное слово записано ?
BPL 134674$ ; Нет
MOV #0,@R5 ; Заполнение нулевой зоны
SOB R0,134674$
BIS #1000,R3 ; Установить бит пропуска синхроимпульсов
134712$:TSTB @R4
BPL 134712$
MOV #120641,@R5 ; Запись первого слова адресного маркера
MOV R3,@R4 ; Установить режим пропуска синхроимпульсов
BIC #1000,R3 ; Сбросить бит пропуска синхроимпульсов
134730$:TSTB @R4
BPL 134730$
MOV #177241,@R5 ; Запись второго слова адресного маркера
134740$:TSTB @R4
BPL 134740$
MOV 23212,@R5 ; Запись номера дорожки и стороны
MOV R3,@R4 ; Сбросить режим пропуска синхроимпульсов
134752$:TSTB @R4
BPL 134752$
MOV R2,@R5 ; Запись номера сектора и формата сектора
MOV #13,R0 ; R0 = размер межсект. пром. перед данными
134764$:BIT #40000,@R4 ; Запись контрольной суммы
BEQ 134764$
MOV #47116,@R5 ; Заполнение межсект. пром. перед данными
134776$:TSTB @R4
BPL 134776$
MOV #47116,@R5 ; Заполнение межсект. пром. перед данными
SOB R0,134776$
MOV #6,R0 ; R0 = размер нулевой зоны
135014$:TSTB @R4
BPL 135014$
MOV #0,@R5 ; Заполнение нулевой зоны
SOB R0,135014$
BIS #1000,R3 ; Установить бит пропуска синхроимпульсов
135032$:TSTB @R4
BPL 135032$
MOV #120641,@R5 ; Запись первого слова маркера данных
MOV R3,@R4 ; Установить режим пропуска синхроимпульсов
BIC #1000,R3 ; Сбросить бит пропуска синхроимпульсов
135050$:TSTB @R4
BPL 135050$
MOV #175641,@R5 ; Запись второго слова маркера данных
MOV R1,R0 ; R0 = размер сектора в словах
135062$:TSTB @R4
BPL 135062$
MOV 23342,@R5 ; Запись первого слова зоны данных
MOV R3,@R4 ; Сбросить режим пропуска синхроимпульсов
DEC R0
135076$:TSTB @R4
BPL 135076$
MOV 23342,@R5 ; Заполнение зоны данных
SOB R0,135076$
INC R2 ; Увеличить номер сектора
MOVB 23302,R0 ; R0 = размер межсект. пром. перед заголовком
135116$:BIT #40000,@R4 ; Запись контрольной суммы
BEQ 135116$
DECB 23246 ; Уменьшить счетчик секторов
BNE 134652$
MOV #1750,R0
135136$:TST @R4 ; Присутствует линия ИНДЕКС ?
BMI 135170$ ; Да
135142$:TSTB @R4
BPL 135142$
MOV #47116,@R5 ; Заполнение конца дорожки
SOB R0,135136$
TST @R5 ; Установить режим готовности чтения
MOVB #14,23334 ; Ошибка - ошибка линии ИНДЕКС
JMP 134422$
135170$:MOV #5,R0
135174$:TSTB @R4
BPL 135174$
MOV #47116,@R5 ; Заполнение в начале первых пяти слов
SOB R0,135174$
TST @R5 ; Установить режим готовности чтения
JMP 134416$
; П/п-мы установок параметров
135214$:CLR R0
MOVB 23335,R0 ; R0 = номер устанавливаемого параметра (1 - 4)
CMP #4,R0 ; Он в диапазоне (1 - 4) ?
BHIS 135242$ ; Да
MOVB #11,23334 ; Ошибка - неверный массив параметров
JMP 134422$
135242$:MOVB 23340,23246 ; (23246) = значение устанавливаемого параметра
DEC R0
MOV #135272$,R1
ADD R0,R1
ADD R0,R1
MOV @R1,R1
CALL @R1 ; Вызов соответствующей п/п
JMP 134416$
; Адреса начала п/п установки значений параметров
135272$:.WORD 135350$,135356$,135364$,135372$
135302$:MOVB 23337,R0 ; R0 = номер накопителя
CMPB #377,R0 ; Устанавливается для всех накопителей ?
BEQ 135326$ ; Да
MOV #1,R2 ; R2 = число накопителей, для кот. уст. парам.
BICB #374,R0
BR 135334$
135326$:CLR R0
MOV #4,R2 ; R2 = число накопителей, для кот. уст. парам.
135334$:ADD R0,R1 ; Корректировка под номер накопителя
135336$:MOVB 23246,@R1 ; Установка нового значения
INC R1
SOB R2,135336$
RETURN
135350$:MOV #23260,R1 ; R1 = адрес буфера времен шага
BR 135302$
135356$:MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки
BR 135302$
135364$:MOV #23270,R1 ; R1 = адрес буфера числа секторов в дорожке
BR 135302$
135372$:MOV #23274,R1 ; R1 = адрес буфера параметра SKIP
MOV #2,23246 ; Принудительная установка пропуска дорожки
BR 135302$
; Устанавливаемые биты в РУС накопителя при выборе соотв. устройства
135406$:.BYTE 3,2,1,0
; Число слов в секторе (формат x,256,512,1024 байт)
135412$:.WORD 0,200,400,1000
; Число секторов в дорожке (формат x,256,512,1024 байт)
135422$:.BYTE 0,20,12,5
; Размер межсекторного промежутка перед заголовком (формат x,256,512,1024 байт)
135426$:.BYTE 0,33,22,72
135432$:.BYTE 0,240,124,242
Автор: SuperMax 29.1.2021, 1:22
Код
; ******************************************************
; * *
; * ГРАФИКА ПОЛЬЗОВАТЕЛЯ, ПРИНТЕР, ПЕЧАТЬ ЭКРАНА *
; * *
; * Адреса 135436 - 157777 *
; * *
; ******************************************************
; ТОЧКА ВХОДА ПРИ ИСПОЛНЕНИИ ESC-ПОСЛЕДОВАТЕЛЬНОСТИ ESC %!0 (ВХОД В ГРАФИКУ)
135436$:MOV R5,-(SP)
MOV SP,R5
135442$:CALL 136274$
TST R0
BNE 135442$
JMP 136056$
; П/п установки начальных значений для п/п графического режима
135456$:MOV R5,-(SP)
MOV SP,R5
MOV 22664,R0
ASL R0
ASL R0
ADD #2500,R0
ADD #-4,R0
MOV R0,23432
MOV 23432,23434
MOV #1200,23412
CLR 23420
CLR 23422
MOV #1,R0
MOV 23420,R1
BIC #177770,R1
MOV R1,23440
ASH 23440,R0
MOV R0,23436
MOV 23432,R0
MOV 23422,R1
ASL R1
ASL R1
SUB R1,R0
MOV R0,23434
MOV @23434,R0
MOV 23420,R1
ASH #-3,R1
MOV R1,23426
ADD 23426,R0
MOV R0,23430
CLR 23442
CLR 23444
CLR 23446
CLR 23450
CLR 23452
CLR 23454
CLR 23456
CLR 23460
CLR 23462
JMP 136056$
; Точка входа при вызове п/п печати экрана
135704$:MOV R0,-(SP)
MOV R1,-(SP)
CALL 140326$
MOV (SP)+,R1
MOV (SP)+,R0
RETURN
; П/п вывода символа на принтер
135722$:MOV R5,-(SP)
MOV SP,R5
BIT #2,177101 ; Принтер в состоянии ON-LINE ?
BEQ 136000$ ; Нет
135736$:BIT #200,177101 ; Бит подтверждения сброшен ?
BNE 135736$ ; Нет
MOV 4(R5),177100 ; Послать код символа на линию данных
BIC #200,177102 ; Установить сигнал строба
135762$:BIT #200,177101 ; Получен сигнал подтверждения ?
BEQ 135762$ ; Нет
MOV #200,177102 ; Сбросить сигнал строба
136000$:JMP 136056$
; П/п инициализации параллельного порта
136004$:MOV R5,-(SP)
MOV SP,R5
MOV #174,177103
MOV #200,177102
JMP 136056$
136030$:MOV R5,R0
MOV SP,R5
MOV R4,-(SP)
MOV R3,-(SP)
MOV R2,-(SP)
CLR -(SP)
JMP @R0
136046$:MOV R5,R2
MOV -(R2),R4
MOV -(R2),R3
MOV -(R2),R2
136056$:MOV R5,SP
MOV (SP)+,R5
RETURN
; Блок описания Esc-последовательностей графического режима
136064$:.WORD 136414$,111,0,136502$ ; LI
136074$:.WORD 136622$,126,136602$,120; MV, MP
.WORD 136562$,115,136542$,114; MM, ML
.WORD 0,136642$
136120$:.WORD 137054$,125,136706$,122; RU,RR
.WORD 136700$,104,0,137064$ ; RD
136140$:.WORD 137122$,104,0,137164$ ; TD
136150$:.WORD 140140$,111,137722$,110; UI, UH
.WORD 137620$,107,137442$,106; UG, UF
.WORD 137432$,105,137424$,104; UE, UD
.WORD 137412$,103,137334$,102; UC, UB
.WORD 137222$,101,0,140174$ ; UA
136220$:.WORD 140232$,41,0,140302$ ; %!
136230$:.WORD 140202$,45,137172$,125 ; %*, U*
.WORD 137072$,124,136650$,122; T*, R*
.WORD 136512$,115,136364$,114; M*, L*
.WORD 0,140310$
136264$:.WORD 136334$,33,0,140316$ ; Esc
136274$:JSR R5,136030$
ADD #-6,SP
CALL 145564$
MOVB R0,-7(R5)
MOVB -7(R5),R0
BIC #177400,R0
MOV #136264$,R1
JMP 144650$
; П/п обработки символа Esc
136334$:CALL 145564$
MOVB R0,-7(R5)
MOVB -7(R5),R0
BIC #177400,R0
MOV #136230$,R1
JMP 144650$
; П/п обработки Esc L
136364$:CALL 145564$
MOVB R0,-7(R5)
MOVB -7(R5),R0
BIC #177400,R0
MOV #136064$,R1
JMP 144650$
; П/п обработки Esc LI
136414$:CALL 143756$
MOV 23424,23456
CALL 143756$
MOV 23424,23460
CALL 143756$
MOV 23424,23462
MOV 23462,@SP
MOV 23460,-(SP)
MOV 23456,-(SP)
CALL 117026$
CMP (SP)+,(SP)+
MOVB #1,R0
BR 136506$
136502$:MOVB #1,R0
136506$:JMP 136046$
; П/п обработки Esc M
136512$:CALL 145564$
MOVB R0,-7(R5)
MOVB -7(R5),R0
BIC #177400,R0
MOV #136074$,R1
JMP 144650$
; П/п обработки Esc ML
136542$:CALL 143756$
MOV 23424,23442
MOVB #1,R0
BR 136506$
; П/п обработки Esc MM
136562$:CALL 143756$
MOV 23424,23446
MOVB #1,R0
BR 136506$
; П/п обработки Esc MP
136602$:CALL 143756$
MOV 23424,23450
MOVB #1,R0
BR 136506$
; П/п обработки Esc MV
136622$:CALL 143756$
MOV 23424,23444
MOVB #1,R0
BR 136506$
136642$:MOVB #1,R0
BR 136506$
; П/п обработки Esc R
136650$:CALL 145564$
MOVB R0,-7(R5)
MOVB -7(R5),R0
BIC #177400,R0
MOV #136120$,R1
JMP 144650$
; П/п обработки Esc RD
136700$:MOVB #1,R0
BR 136506$
; П/п обработки Esc RR
136706$:CALL 144104$
CMP 23420,23412
BGE 136732$
CMP 23422,22664
BLT 136740$
136732$:MOVB #1,R0
BR 136506$
136740$:MOV 23420,-12(R5)
MOV 23422,-14(R5)
CALL 144104$
CMP 23420,23412
BGE 137000$
CMP 23422,22664
BLT 137006$
137000$:MOVB #1,R0
BR 136506$
137006$:CALL 143756$
MOV 23424,@SP
MOV 23422,-(SP)
MOV 23420,-(SP)
MOV -14(R5),-(SP)
MOV -12(R5),-(SP)
CALL 144666$
ADD #10,SP
MOVB #1,R0
BR 137060$
; П/п обработки Esc RU
137054$:MOVB #1,R0
137060$:JMP 136046$
137064$:MOVB #1,R0
BR 137060$
; П/п обработки Esc T
137072$:CALL 145564$
MOVB R0,-7(R5)
MOVB -7(R5),R0
BIC #177400,R0
MOV #136140$,R1
JMP 144650$
; П/п обработки Esc TD
137122$:CALL 143756$
MOV 23424,23452
CALL 143756$
MOV 23424,23454
MOV 23452,@SP
CALL 117004$
MOVB #1,R0
BR 137060$
137164$:MOVB #1,R0
BR 137060$
; П/п обработки Esc U
137172$:CALL 145564$
MOVB R0,-7(R5)
MOVB -7(R5),R0
BIC #177400,R0
MOV #136150$,R1
JMP 144650$
; П/п обработки Esc UA
137222$:MOV 23430,177010
TST 177024
BNE 137236$
137236$:BIT #4,23440
BEQ 137254$
MOV 177022,R0
BR 137260$
137254$:MOV 177020,R0
137260$:MOV R0,R1
CLR R0
MOV 23440,R4
BIC #177774,R4
ASL R4
ASL R4
NEG R4
ASHC R4,R0
MOV R1,@SP
BIC #177760,@SP
CALL 144304$
MOV #15,@SP
CALL 145612$
MOVB #1,R0
BR 137060$
; П/п обработки Esc UB
137334$:MOV 23414,23420
MOV 23416,23422
MOV 23422,23414
MOV 23420,23416
CALL 151714$
MOV 23420,23414
MOV 23422,23416
MOVB #1,R0
BR 137060$
; П/п обработки Esc UC
137412$:CALL 151650$
MOVB #1,R0
BR 137060$
; П/п обработки Esc UD
137424$:MOVB #1,R0
BR 137436$
; П/п обработки Esc UE
137432$:MOVB #1,R0
137436$:JMP 136046$
; П/п обработки Esc UF
137442$:CALL 144104$
CMP 23420,23412
BGE 137466$
CMP 23422,22664
BLT 137474$
137466$:MOVB #1,R0
BR 137436$
137474$:MOV #1,R0
MOV 23420,R1
BIC #177770,R1
MOV R1,23440
ASH 23440,R0
MOV R0,23436
MOV 23432,R0
MOV 23422,R1
ASL R1
ASL R1
SUB R1,R0
MOV R0,23434
MOV @23434,R0
MOV 23420,R1
ASH #-3,R1
MOV R1,23426
ADD 23426,R0
MOV R0,23430
MOV 23420,23414
MOV 23422,23416
MOVB #1,R0
BR 137436$
; П/п обработки Esc UG
137620$:CALL 144104$
CMP 23420,23412
BGE 137644$
CMP 23422,22664
BLT 137652$
137644$:MOVB #1,R0
BR 137436$
137652$:MOV 23442,177016
MOV 23430,177010
TST 177024
BNE 137674$
137674$:MOV 23430,177010
MOV 23436,177024
CALL 141330$
MOVB #1,R0
BR 137436$
; П/п обработки Esc UH
137722$:CALL 144104$
CMP 23420,23412
BGE 137746$
CMP 23422,22664
BLT 137754$
137746$:MOVB #1,R0
BR 140134$
137754$:MOV #1,R0
MOV 23420,R1
BIC #177770,R1
MOV R1,23440
ASH 23440,R0
MOV R0,23436
MOV 23432,R0
MOV 23422,R1
ASL R1
ASL R1
SUB R1,R0
MOV R0,23434
MOV @23434,R0
MOV 23420,R1
ASH #-3,R1
MOV R1,23426
ADD 23426,R0
MOV R0,23430
MOV 23420,23414
MOV 23422,23416
MOV 23442,177016
MOV 23430,177010
TST 177024
BNE 140114$
140114$:MOV 23430,177010
MOV 23436,177024
MOVB #1,R0
140134$:JMP 136046$
; П/п обработки Esc UI
140140$:MOV 23416,@SP
MOV 23414,-(SP)
CALL 144454$
TST (SP)+
MOV #15,@SP
CALL 145612$
MOVB #1,R0
BR 140134$
140174$:MOVB #1,R0
BR 140134$
; П/п обработки Esc %
140202$:CALL 145564$
MOVB R0,-7(R5)
MOVB -7(R5),R0
BIC #177400,R0
MOV #136220$,R1
JMP 144650$
; П/п обработки Esc %!
140232$:CALL 145564$
MOVB R0,-7(R5)
CMPB -7(R5),#'0
BEQ 140274$
MOVB -7(R5),R0
BIC #177400,R0
MOV R0,@SP
CALL 113574$
CLR R0
BR 140134$
140274$:MOVB #1,R0
BR 140134$
140302$:MOVB #1,R0
BR 140134$
140310$:MOVB #1,R0
BR 140134$
140316$:MOVB #1,R0
BR 140134$
140324$:BR 140134$
; П/п печати экрана
140326$:JSR R5,136030$
ADD #-22,SP
BIT #2,177101
BEQ 140602$
BIC #100,177700
MOV #15,@SP
CALL 135722$
MOV #12,@SP
CALL 135722$
CLR -10(R5)
140400$:CMP -10(R5),#79.
BGT 140552$
MOV #1,-20(R5)
140416$:CMP -20(R5),#2
BGT 140606$
MOV #33,@SP
CALL 135722$
MOV #52,@SP
CALL 135722$
MOV #1,@SP
CALL 135722$
MOV #30,@SP
CALL 135722$
MOV #3,@SP
CALL 135722$
CLR -12(R5)
140502$:CMP -12(R5),#263.
BGT 140622$
MOV 23432,R0
MOV -12(R5),R1
ASL R1
ASL R1
SUB R1,R0
MOV @R0,R0
ADD -10(R5),R0
MOV R0,177010
TST 177024
BEQ 141004$
BR 141004$
140552$:MOV #33,@SP
CALL 135722$
MOV #100,@SP
CALL 135722$
MOV #14,@SP
CALL 135722$
140602$:JMP 136046$
140606$:INC -10(R5)
BR 140400$
140614$:INC -20(R5)
BR 140416$
140622$:MOV #33,@SP
CALL 135722$
MOV #63,@SP
CALL 135722$
MOV -20(R5),R1
MUL #22.,R1
MOV R1,@SP
ADD #-21.,@SP
CALL 135722$
MOV #12,@SP
CALL 135722$
MOV #15,@SP
CALL 135722$
BIT #200,177700
BEQ 140614$
CMP 177702,#4
BNE 140614$
MOV #33,@SP
CALL 135722$
MOV #100,@SP
CALL 135722$
MOV #15,@SP
CALL 135722$
MOV #12,@SP
CALL 135722$
MTPS #340
BIS #100,177700
MTPS #0
BR 140602$
141004$:MOV 177020,-30(R5)
MOV #1,-14(R5)
141020$:CMP -14(R5),#8.
BGT 141246$
MOV -30(R5),R0
BIC #177760,R0
MOV R0,-16(R5)
MOV -22(R5),R0
ASL R0
MOV #153540,R1
MOV #1,R4
MOV -16(R5),R2
ASL R2
SUB R2,R4
SUB -20(R5),R4
ASH R4,R1
BIC #177776,R1
BIS R1,R0
MOV R0,-22(R5)
MOV -24(R5),R0
ASL R0
MOV #177624,R1
MOV #1,R4
MOV -16(R5),R2
ASL R2
SUB R2,R4
SUB -20(R5),R4
ASH R4,R1
BIC #177776,R1
BIS R1,R0
MOV R0,-24(R5)
MOV -26(R5),R0
ASL R0
MOV #172100,R1
MOV #1,R4
MOV -16(R5),R2
ASL R2
SUB R2,R4
SUB -20(R5),R4
ASH R4,R1
BIC #177776,R1
BIS R1,R0
MOV R0,-26(R5)
CMP -14(R5),#4
BNE 141306$
MOV 177022,-30(R5)
BR 141322$
141246$:MOV -22(R5),@SP
CALL 135722$
MOV -24(R5),@SP
CALL 135722$
MOV -26(R5),@SP
CALL 135722$
INC -12(R5)
JMP 140502$
141306$:MOV -30(R5),R0
ASH #-4,R0
MOV R0,-30(R5)
141322$:INC -14(R5)
BR 141020$
; П/п рисования линии
141330$:MOV R5,-(SP)
MOV SP,R5
ADD #-20,SP
MOV 23420,R0
SUB 23414,R0
MOV R0,-12(R5)
MOV 23422,R0
SUB 23416,R0
MOV R0,-14(R5)
TST -14(R5)
BNE 141404$
TST -12(R5)
BEQ 141560$
141404$:MOV 23420,23414
MOV 23422,23416
CLR -16(R5)
TST -14(R5)
BLT 141564$
TST -12(R5)
BLT 141712$
CMP -12(R5),-14(R5)
BGT 141454$
JMP 142106$
141454$:MOV -12(R5),-20(R5)
MOV -20(R5),-10(R5)
141470$:MOV -10(R5),R0
DEC -10(R5)
TST R0
BEQ 141560$
SUB -14(R5),-16(R5)
MOV 23436,R0
ASL R0
BIC #177400,R0
MOV R0,23436
BEQ 141536$
JMP 142260$
141536$:MOV #1,23436
INC 23430
INC 23426
JMP 142260$
141560$:JMP 136056$
141564$:TST -12(R5)
BLT 141576$
JMP 142722$
141576$:CMP -12(R5),-14(R5)
BLT 141612$
JMP 143136$
141612$:MOV -12(R5),R0
NEG R0
MOV R0,-20(R5)
MOV -20(R5),-10(R5)
141632$:MOV -10(R5),R0
DEC -10(R5)
TST R0
BEQ 141560$
ADD -14(R5),-16(R5)
CLC
ROR 23436
BEQ 141670$
JMP 143310$
141670$:MOV #200,23436
DEC 23430
DEC 23426
JMP 143310$
141712$:MOV -12(R5),R0
NEG R0
CMP R0,-14(R5)
BLT 141732$
141726$:JMP 142442$
141732$:MOV -14(R5),-20(R5)
MOV -20(R5),-10(R5)
141746$:MOV -10(R5),R0
DEC -10(R5)
TST R0
BEQ 141560$
ADD -12(R5),-16(R5)
SUB #4,23434
MOV @23434,R0
ADD 23426,R0
MOV R0,23430
TST -16(R5)
BGE 142030$
MOV -16(R5),R0
NEG R0
BR 142034$
142030$:MOV -16(R5),R0
142034$:ASL R0
CMP R0,-20(R5)
BGE 142050$
JMP 142540$
142050$:CLC
ROR 23436
BEQ 142064$
JMP 142556$
142064$:MOV #200,23436
DEC 23430
DEC 23426
JMP 142556$
142106$:MOV -14(R5),-20(R5)
MOV -20(R5),-10(R5)
142122$:MOV -10(R5),R0
DEC -10(R5)
TST R0
BEQ 141560$
ADD -12(R5),-16(R5)
SUB #4,23434
MOV @23434,R0
ADD 23426,R0
MOV R0,23430
TST -16(R5)
BGE 142204$
MOV -16(R5),R0
NEG R0
BR 142210$
142204$:MOV -16(R5),R0
142210$:ASL R0
CMP R0,-20(R5)
BLT 142376$
MOV 23436,R0
ASL R0
BIC #177400,R0
MOV R0,23436
BNE 142414$
MOV #1,23436
INC 23430
INC 23426
BR 142414$
142260$:TST -16(R5)
BGE 142276$
MOV -16(R5),R0
NEG R0
BR 142302$
142276$:MOV -16(R5),R0
142302$:ASL R0
CMP R0,-20(R5)
BLT 142342$
SUB #4,23434
MOV @23434,R0
ADD 23426,R0
MOV R0,23430
ADD -12(R5),-16(R5)
142342$:MOV 23430,177010
TST 177024
BNE 142356$
142356$:MOV 23430,177010
MOV 23436,177024
JMP 141470$
142376$:MOV 23430,177010
TST 177024
BEQ 142424$
BR 142424$
142414$:SUB -14(R5),-16(R5)
BR 142376$
142424$:MOV 23430,177010
MOV 23436,177024
BR 142122$
142442$:MOV -12(R5),R0
NEG R0
MOV R0,-20(R5)
MOV -20(R5),-10(R5)
142462$:MOV -10(R5),R0
DEC -10(R5)
TST R0
BNE 142502$
JMP 141560$
142502$:ADD -14(R5),-16(R5)
CLC
ROR 23436
BNE 142606$
MOV #200,23436
DEC 23430
DEC 23426
BR 142606$
142540$:MOV 23430,177010
TST 177024
BEQ 142566$
BR 142566$
142556$:ADD -14(R5),-16(R5)
BR 142540$
142566$:MOV 23430,177010
MOV 23436,177024
JMP 141746$
142606$:TST -16(R5)
BGE 142624$
MOV -16(R5),R0
NEG R0
BR 142630$
142624$:MOV -16(R5),R0
142630$:ASL R0
CMP R0,-20(R5)
BLT 142670$
SUB #4,23434
MOV @23434,R0
ADD 23426,R0
MOV R0,23430
ADD -12(R5),-16(R5)
142670$:MOV 23430,177010
TST 177024
BNE 142704$
142704$:MOV 23430,177010
MOV 23436,177024
BR 142462$
142722$:MOV -14(R5),R0
NEG R0
CMP -12(R5),R0
BLE 142742$
JMP 143472$
142742$:MOV -14(R5),R0
NEG R0
MOV R0,-20(R5)
MOV -20(R5),-10(R5)
142762$:MOV -10(R5),R0
DEC -10(R5)
TST R0
BNE 143002$
JMP 141560$
143002$:SUB -12(R5),-16(R5)
ADD #4,23434
MOV @23434,R0
ADD 23426,R0
MOV R0,23430
TST -16(R5)
BGE 143050$
MOV -16(R5),R0
NEG R0
BR 143054$
143050$:MOV -16(R5),R0
143054$:ASL R0
CMP R0,-20(R5)
BGE 143070$
JMP 143574$
143070$:MOV 23436,R0
ASL R0
BIC #177400,R0
MOV R0,23436
BEQ 143114$
JMP 143612$
143114$:MOV #1,23436
INC 23430
INC 23426
JMP 143612$
143136$:MOV -14(R5),R0
NEG R0
MOV R0,-20(R5)
MOV -20(R5),-10(R5)
143156$:MOV -10(R5),R0
DEC -10(R5)
TST R0
BNE 143176$
JMP 141560$
143176$:SUB -12(R5),-16(R5)
ADD #4,23434
MOV @23434,R0
ADD 23426,R0
MOV R0,23430
TST -16(R5)
BGE 143244$
MOV -16(R5),R0
NEG R0
BR 143250$
143244$:MOV -16(R5),R0
143250$:ASL R0
CMP R0,-20(R5)
BLT 143426$
CLC
ROR 23436
BNE 143444$
MOV #200,23436
DEC 23430
DEC 23426
BR 143444$
143310$:TST -16(R5)
BGE 143326$
MOV -16(R5),R0
NEG R0
BR 143332$
143326$:MOV -16(R5),R0
143332$:ASL R0
CMP R0,-20(R5)
BLT 143372$
ADD #4,23434
MOV @23434,R0
ADD 23426,R0
MOV R0,23430
SUB -12(R5),-16(R5)
143372$:MOV 23430,177010
TST 177024
BNE 143406$
143406$:MOV 23430,177010
MOV 23436,177024
JMP 141632$
143426$:MOV 23430,177010
TST 177024
BEQ 143454$
BR 143454$
143444$:ADD -14(R5),-16(R5)
BR 143426$
143454$:MOV 23430,177010
MOV 23436,177024
BR 143156$
143472$:MOV -12(R5),-20(R5)
MOV -20(R5),-10(R5)
143506$:MOV -10(R5),R0
DEC -10(R5)
TST R0
BNE 143526$
JMP 141560$
143526$:SUB -14(R5),-16(R5)
MOV 23436,R0
ASL R0
BIC #177400,R0
MOV R0,23436
BNE 143642$
MOV #1,23436
INC 23430
INC 23426
BR 143642$
143574$:MOV 23430,177010
TST 177024
BEQ 143622$
BR 143622$
143612$:SUB -14(R5),-16(R5)
BR 143574$
143622$:MOV 23430,177010
MOV 23436,177024
JMP 142762$
143642$:TST -16(R5)
BGE 143660$
MOV -16(R5),R0
NEG R0
BR 143664$
143660$:MOV -16(R5),R0
143664$:ASL R0
CMP R0,-20(R5)
BLT 143724$
ADD #4,23434
MOV @23434,R0
ADD 23426,R0
MOV R0,23430
SUB -12(R5),-16(R5)
143724$:MOV 23430,177010
TST 177024
BNE 143740$
143740$:MOV 23430,177010
MOV 23436,177024
BR 143506$
; П/п приема трех символов и перевода их в целое число
143756$:MOV R5,-(SP)
MOV SP,R5
ADD #-10,SP
CALL 145564$
ASH #6,R0
MOV R0,23424
CALL 145564$
BIC #177700,R0
BIS 23424,R0
ASH #4,R0
MOV R0,23424
CALL 145564$
MOV R0,-10(R5)
MOV -10(R5),R0
BIC #177760,R0
BIS 23424,R0
MOV R0,23424
BIT #20,-10(R5)
BNE 144100$
MOV 23424,R0
NEG R0
MOV R0,23424
144100$:JMP 136056$
; П/п приема пяти символов и перевода их в два целых числа
144104$:MOV R5,-(SP)
MOV SP,R5
ADD #-10,SP
CALL 145564$
BIC #177740,R0
ASH #5,R0
MOV R0,23422
CALL 145564$
MOV R0,-10(R5)
CALL 145564$
BIC #177740,R0
BIS 23422,R0
ASL R0
ASL R0
MOV R0,23422
CALL 145564$
BIC #177740,R0
ASH #5,R0
MOV R0,23420
CALL 145564$
BIC #177740,R0
BIS 23420,R0
ASL R0
ASL R0
MOV R0,23420
MOV -10(R5),R0
ASR R0
ASR R0
BIC #177774,R0
BIS 23422,R0
MOV R0,23422
MOV -10(R5),R0
BIC #177774,R0
BIS 23420,R0
MOV R0,23420
JMP 136056$
; П/п преобразования целого числа в три символа и их вывод
144304$:MOV R5,-(SP)
MOV SP,R5
ADD #-12,SP
TST 4(R5)
BGE 144342$
MOV 4(R5),R0
NEG R0
MOV R0,4(R5)
CLR -10(R5)
BR 144350$
144342$:MOV #20,-10(R5)
144350$:MOV 4(R5),R0
ASH #-12,R0
MOV R0,@SP
BIC #177700,@SP
BIS #100,@SP
CALL 145612$
MOV 4(R5),R0
ASH #-4,R0
MOV R0,@SP
BIC #177700,@SP
BIS #100,@SP
CALL 145612$
MOV 4(R5),@SP
BIC #177760,@SP
BIS -10(R5),@SP
BIS #40,@SP
CALL 145612$
JMP 136056$
; П/п преобразования двух целых чисел в пять символов и их вывод
144454$:MOV R5,-(SP)
MOV SP,R5
TST -(SP)
MOV 6(R5),R0
ASH #-7,R0
MOV R0,@SP
BIC #177740,@SP
BIS #40,@SP
CALL 145612$
MOV 4(R5),@SP
BIC #177774,@SP
MOV 6(R5),R0
BIC #177774,R0
ASL R0
ASL R0
BIS R0,@SP
BIS #140,@SP
CALL 145612$
MOV 6(R5),@SP
ASR @SP
ASR @SP
BIC #177740,@SP
BIS #140,@SP
CALL 145612$
MOV 4(R5),R0
ASH #-7,R0
MOV R0,@SP
BIC #177740,@SP
BIS #40,@SP
CALL 145612$
MOV 4(R5),@SP
ASR @SP
ASR @SP
BIC #177740,@SP
BIS #100,@SP
CALL 145612$
JMP 136056$
144650$:TST (R1)+
BEQ 144664$
CMP R0,(R1)+
BNE 144650$
JMP @-4(R1)
144664$:JMP @(R1)+
; П/п закраски прямоугольной области
144666$:MOV R5,-(SP)
MOV SP,R5
ADD #-22,SP
MOV #1,R0
MOV 10(R5),R1
BIC #177770,R1
MOV R1,23440
ASH 23440,R0
MOV R0,23436
MOV 23432,R0
MOV 12(R5),R1
ASL R1
ASL R1
SUB R1,R0
MOV R0,23434
MOV @23434,R0
MOV 10(R5),R1
ASH #-3,R1
MOV R1,23426
ADD 23426,R0
MOV R0,23430
MOV 23426,-14(R5)
MOV 23434,-22(R5)
MOV #100000,R0
MOV 23440,R1
ADD #-16,R1
ASH R1,R0
COM R0
MOV R0,-12(R5)
MOV #1,R0
MOV 4(R5),R1
BIC #177770,R1
MOV R1,23440
ASH 23440,R0
MOV R0,23436
MOV 23432,R0
MOV 6(R5),R1
ASL R1
ASL R1
SUB R1,R0
MOV R0,23434
MOV @23434,R0
MOV 4(R5),R1
ASH #-3,R1
MOV R1,23426
ADD 23426,R0
MOV R0,23430
MOV #100000,R0
MOV 23440,R1
ADD #-17,R1
ASH R1,R0
MOV R0,-10(R5)
MOV -14(R5),R0
SUB 23426,R0
MOV R0,-20(R5)
MOV 23430,R0
ADD -20(R5),R0
MOV R0,-16(R5)
TST -20(R5)
BNE 145234$
MOV -12(R5),R0
COM R0
BIC R0,-10(R5)
145234$:MOV 14(R5),177016
145242$:CMP 23434,-22(R5)
BLO 145270$
MOV 23430,177010
TST 177024
BEQ 145376$
BR 145376$
145270$:MOV #1,R0
MOV 23414,R1
BIC #177770,R1
MOV R1,23440
ASH 23440,R0
MOV R0,23436
MOV 23432,R0
MOV 23416,R1
ASL R1
ASL R1
SUB R1,R0
MOV R0,23434
MOV @23434,R0
MOV 23414,R1
ASH #-3,R1
MOV R1,23426
ADD 23426,R0
MOV R0,23430
JMP 136056$
145376$:MOV 23430,177010
MOV -10(R5),177024
TST -20(R5)
BEQ 145452$
145420$:INC 23430
CMP 23430,-16(R5)
BHIS 145512$
MOV 23430,177010
TST 177024
BEQ 145530$
BR 145530$
145452$:SUB #4,23434
MOV @23434,R0
ADD 23426,R0
MOV R0,23430
MOV 23430,R0
ADD -20(R5),R0
MOV R0,-16(R5)
BR 145242$
145512$:MOV 23430,177010
TST 177024
BEQ 145546$
BR 145546$
145530$:MOV 23430,177010
MOV #377,177024
BR 145420$
145546$:MOV 23430,177010
MOV -12(R5),177024
BR 145452$
; П/п приема символа
145564$:MOV R5,-(SP)
MOV R4,-(SP)
MOV R3,-(SP)
MOV R2,-(SP)
CALL 110762$
MOV (SP)+,R2
MOV (SP)+,R3
MOV (SP)+,R4
MOV (SP)+,R5
RETURN
; П/п вывода символа
145612$:MOV 2(SP),R0
CALL 104160$
RETURN
; Все остальные п/п относятся к обработке последовательностей Esc UB и Esc UC
145624$:MOV SP,23602
CALL 152144$
BHIS 145642$
JMP 145716$
145642$:CALL 151000$
BLO 145732$
145650$:MOV #23540,R1
CMP 2(R1),#23546
BEQ 145732$
CALL 145734$
BLO 145676$
CALL 146010$
145676$:MOV #23546,R1
CALL 145762$
BLO 145650$
CALL 146104$
BR 145650$
145716$:MOV 23602,SP
MOV #1,R0
BR 145732$
CLR R0
145732$:RETURN
145734$:MOV 2(R1),R1
TST @R1
BEQ 145756$
MOV 6(R1),23564
BEQ 145734$
BR 145760$
145756$:SEC
145760$:RETURN
145762$:MOV 4(R1),R1
TST @R1
BEQ 146004$
MOV 10(R1),23564
BEQ 145762$
BR 146006$
146004$:SEC
146006$:RETURN
146010$:MOV 0(R1),23560
MOV #1,23572
MOV 23474,23574
INC 23574
MOV #0,23576
MOV #2,23600
MOV #-2,23606
MOV #2,23610
MOV R1,23554
ADD #2,R1
CALL 146200$
RETURN
146104$:MOV 0(R1),23560
MOV #-1,23572
MOV #0,23574
MOV 23474,23576
INC 23576
MOV #-2,23600
MOV #-4,23606
MOV #4,23610
MOV R1,23554
ADD #4,R1
CALL 146200$
RETURN
146200$:MOV 23564,R2
MOV 23566,R3
MOV 23502,R5
146214$:MOV (R2)+,(R3)+
SOB R5,146214$
MOV 20(R1),23616
MOV 10(R1),23620
MOV 14(R1),23562
MOV 23570,R0
MOV 23502,R5
146252$:CLR (R0)+
SOB R5,146252$
MOV 10(R1),R5
MOV 20(R1),R0
SUB R0,R5
ASR R5
INC R5
MOV 23570,R2
ADD R0,R2
ADD 23562,R0
MOV R2,-(SP)
MOV R0,-(SP)
146312$:CALL 147760$
BIS R4,(R2)+
ADD #2,R0
SOB R5,146312$
MOV 10(R1),R5
ADD 23564,R5
MOV @R5,R5
CALL 150136$
BIT #100000,R5
BEQ 146412$
MOV 23476,R5
SUB 10(R1),R5
ASR R5
DEC R5
BEQ 146412$
146370$:CALL 147760$
BIS R4,(R2)+
CMP #-1,R4
BNE 146412$
ADD #2,R0
SOB R5,146370$
146412$:MOV (SP)+,R0
MOV (SP)+,R2
MOV @R2,R4
MOV 20(R1),R5
ADD 23564,R5
MOV @R5,R5
CALL 150136$
BIT #1,R5
BEQ 146476$
MOV 20(R1),R5
BEQ 146476$
ASR R5
146454$:SUB #2,R0
CALL 147760$
BIS R4,-(R2)
CMP #-1,R4
BNE 146476$
SOB R5,146454$
146476$:MOV #23604,R5
CALL 150246$
MOV 23604,R0
MOV 23570,R3
MOV 20(R1),R2
ADD R2,R0
ADD R2,R3
ADD 23564,R2
MOV 10(R1),R5
SUB 20(R1),R5
ASR R5
INC R5
MOV R5,-(SP)
BR 146556$
146552$:BIS #1,@R2
146556$:MOV R5,-(SP)
MOV (R2)+,R5
MOV (R3)+,R4
CALL 150136$
BIS R5,(R0)+
MOV (SP)+,R5
BIT #100000,R4
BNE 146606$
SOB R5,146556$
BR 146674$
146606$:SOB R5,146552$
MOV R0,-(SP)
MOV R2,-(SP)
MOV R3,-(SP)
MOV 23476,R5
SUB 10(R1),R5
ASR R5
DEC R5
BEQ 146666$
146634$:MOV R5,-(SP)
BIS #1,@R2
MOV (R2)+,R5
MOV (R3)+,R4
CALL 150136$
BIS R5,(R0)+
MOV (SP)+,R5
BIT #100000,R4
BEQ 146666$
SOB R5,146634$
146666$:MOV (SP)+,R3
MOV (SP)+,R2
MOV (SP)+,R0
146674$:MOV (SP)+,R5
BR 146706$
146700$:BIS #100000,-2(R2)
146706$:MOV R5,-(SP)
MOV -(R2),R5
MOV -(R3),R4
CALL 150136$
BIS R5,-(R0)
MOV (SP)+,R5
BIT #1,R4
BNE 146736$
SOB R5,146706$
BR 147002$
146736$:SOB R5,146700$
TST 20(R1)
BEQ 147002$
MOV @R0,R4
146750$:BIT #1,R4
BEQ 147002$
BIS #100000,-(R2)
MOV @R2,R5
MOV -(R3),R4
CALL 150136$
BIS R5,-(R0)
CMP R0,23604
BHI 146750$
147002$:MOV 23604,R0
MOV 23570,R3
MOV 23502,R5
147016$:MOV (R0)+,(R3)+
SOB R5,147016$
MOV 23604,R5
CALL 150470$
BHIS 147050$
MOV 23536,@R5
MOV R5,23536
JMP 147644$
147050$:CALL 150716$
MOV 23560,R3
ADD 23572,R3
CMP R3,23574
BEQ 147426$
CALL 147732$
CALL 150576$
MOV R4,23556
ADD 23610,R4
MOV 23636,14(R4)
ADD 23630,14(R4)
MOV 4(R4),R3
BNE 147160$
MOV 23604,4(R4)
MOV 23612,20(R4)
MOV 23614,10(R4)
BR 147240$
147160$:MOV 23502,R5
MOV 23604,R0
147170$:BIS (R0)+,(R3)+
SOB R5,147170$
CMP 23612,20(R4)
BGE 147212$
MOV 23612,20(R4)
147212$:CMP 23614,10(R4)
BLE 147230$
MOV 23614,10(R4)
147230$:MOV 23604,R5
CALL 150300$
147240$:MOV R4,-(SP)
MOV R1,-(SP)
MOV 23612,-(SP)
MOV 23614,-(SP)
MOV R4,R1
ADD 23600,R1
MOV 4(R1),R2
BEQ 147412$
MOV 4(R4),R3
MOV 23502,R5
MOV R2,-(SP)
MOV R3,-(SP)
147304$:MOV @R2,R0
BIC @R3,(R2)+
BIC R0,(R3)+
SOB R5,147304$
MOV (SP)+,R3
MOV (SP)+,R2
MOV 23556,23640
MOV R2,R5
CALL 150470$
BCC 147344$
CALL 150332$
BR 147360$
147344$:MOV 23612,20(R1)
MOV 23614,10(R1)
147360$:MOV R3,R5
CALL 150470$
BCC 147376$
CALL 150332$
BR 147412$
147376$:MOV 23612,20(R4)
MOV 23614,10(R4)
147412$:MOV (SP)+,23614
MOV (SP)+,23612
MOV (SP)+,R1
MOV (SP)+,R4
147426$:SUB 23572,23560
CMP 23560,23576
BEQ 147644$
MOV 23566,R0
MOV 23570,R3
MOV 23502,R5
147460$:BIC (R0)+,(R3)+
SOB R5,147460$
MOV 23570,R5
CALL 150470$
BCS 147644$
MOV 23560,R3
CALL 147732$
CALL 150576$
ADD 23610,R4
ADD 23600,R4
MOV 23636,14(R4)
MOV 4(R4),R3
BNE 147554$
MOV R4,R5
ADD #4,R5
CALL 150246$
MOV 4(R4),R3
147554$:MOV 23614,R5
SUB 23612,R5
ASR R5
INC R5
MOV 23570,R2
ADD 23612,R2
ADD 23612,R3
147604$:BIS (R2)+,(R3)+
SOB R5,147604$
CMP 23612,20(R4)
BGE 147626$
MOV 23612,20(R4)
147626$:CMP 23614,10(R4)
BLE 147644$
MOV 23614,10(R4)
147644$:MOV R1,R5
MOV 23554,23640
CALL 150332$
RETURN
147662$:MOV (SP)+,23642
MOV R1,-(SP)
MOV R2,-(SP)
MOV R3,-(SP)
MOV R4,-(SP)
MOV R5,-(SP)
MOV 23642,-(SP)
RETURN
147706$:MOV (SP)+,23642
MOV (SP)+,R5
MOV (SP)+,R4
MOV (SP)+,R3
MOV (SP)+,R2
MOV (SP)+,R1
MOV 23642,-(SP)
RETURN
147732$:MOV R3,-(SP)
DEC R3
NEG R3
ASL R3
ASL R3
ADD 23504,R3
MOV @R3,23636
MOV (SP)+,R3
RETURN
147760$:MOV R3,-(SP)
MOV R5,-(SP)
CLR R4
DEC R4
MOV R0,177010
MOVB 177012,R5
MOV 23464,R3
XOR R3,R5
BICB R5,R4
MOVB 177014,R5
MOV 23466,R3
XOR R3,R5
BICB R5,R4
MOVB 177015,R5
MOV 23470,R3
XOR R3,R5
BICB R5,R4
INC R0
SWAB R4
MOV R0,177010
MOVB 177012,R5
MOV 23464,R3
XOR R3,R5
BICB R5,R4
MOVB 177014,R5
MOV 23466,R3
XOR R3,R5
BICB R5,R4
MOVB 177015,R5
MOV 23470,R3
XOR R3,R5
BICB R5,R4
SWAB R4
TST 23634
BNE 150126$
COM R4
150126$:DEC R0
MOV (SP)+,R5
MOV (SP)+,R3
RETURN
150136$:TST R5
BEQ 150234$
COM R4
BEQ 150240$
BIC R4,R5
BEQ 150234$
MOV R0,-(SP)
MOV R1,-(SP)
MOV R4,-(SP)
COM R4
CLR R0
150164$:MOV R4,R1
DEC R1
XOR R4,R1
BIS R1,R4
MOV R4,R1
INC R1
XOR R4,R1
BLT 150210$
CLC
ROR R1
150210$:BIC R0,R1
BIS R1,R0
BIT R1,R5
BEQ 150222$
BIS R1,R5
150222$:BIC R0,R4
BNE 150164$
BIC (SP)+,R5
MOV (SP)+,R1
MOV (SP)+,R0
150234$:MOV R5,R4
RETURN
150240$:COM R4
MOV R4,R5
RETURN
150246$:MOV 23536,@R5
BNE 150260$
JMP 145716$
150260$:MOV @23536,23536
MOV R5,-(SP)
MOV @R5,R5
CLR @R5
MOV (SP)+,R5
RETURN
150300$:MOV R3,-(SP)
MOV 23476,R3
ADD R3,R5
ASR R3
150312$:CLR -(R5)
SOB R3,150312$
MOV 23536,@R5
MOV R5,23536
MOV (SP)+,R3
RETURN
150332$:MOV R5,-(SP)
MOV 4(R5),R4
BEQ 150372$
MOV R5,-(SP)
MOV R4,R5
CALL 150300$
MOV (SP)+,R5
CLR 4(R5)
MOV #10000,20(R5)
CLR 10(R5)
150372$:MOV 23640,R5
TST 6(R5)
BNE 150464$
TST 10(R5)
BNE 150464$
MOV R2,-(SP)
MOV R3,-(SP)
MOV 2(R5),R2
MOV 4(R5),R3
MOV R3,4(R2)
MOV R2,2(R3)
CLR 2(R5)
CLR 4(R5)
MOV (SP)+,R3
MOV (SP)+,R2
MOV 23506,0(R5)
MOV R5,23506
150464$:MOV (SP)+,R5
RETURN
150470$:MOV R5,-(SP)
MOV R2,-(SP)
MOV R3,-(SP)
MOV R5,R2
MOV 23502,R3
150504$:TST (R2)+
BNE 150524$
SOB R3,150504$
MOV (SP)+,R3
MOV (SP)+,R2
MOV (SP)+,R5
SEC
RETURN
150524$:SUB #2,R2
MOV R2,23612
MOV 23476,R3
ADD R3,R5
ASR R3
150544$:TST -(R5)
BNE 150552$
SOB R3,150544$
150552$:MOV R5,23614
MOV (SP)+,R3
MOV (SP)+,R2
MOV (SP)+,R5
SUB R5,23612
SUB R5,23614
RETURN
150576$:MOV R2,-(SP)
MOV R3,-(SP)
MOV R5,-(SP)
MOV #23540,R4
150610$:MOV 2(R4),R5
TST @R5
BEQ 150634$
CMP 0(R5),R3
BGT 150634$
BEQ 150704$
MOV R5,R4
BR 150610$
150634$:MOV 23506,R2
BNE 150646$
JMP 145716$
150646$:MOV @R2,23506
MOV R3,0(R2)
MOV 2(R4),2(R2)
MOV R2,2(R4)
MOV 4(R5),4(R2)
MOV R2,4(R5)
MOV R2,R5
150704$:MOV R5,R4
MOV (SP)+,R5
MOV (SP)+,R3
MOV (SP)+,R2
RETURN
150716$:MOV R2,-(SP)
MOV R3,-(SP)
MOV R5,-(SP)
MOV 23612,R2
MOV 23614,R5
SUB R2,R5
ADD #2,R5
MOV R2,R3
ADD 23604,R3
ADD 14(R1),R2
150754$:MOV R2,177010
MOVB (R3)+,177024
INC R2
SOB R5,150754$
MOV (SP)+,R5
MOV (SP)+,R3
MOV (SP)+,R2
RETURN
151000$:MOV 23652,R3
CALL 150576$
MOV R4,23624
MOV #23604,R5
CALL 150246$
MOV 23604,6(R4)
MOV R3,0(R4)
MOV R3,23626
MOV 23654,R0
DEC R0
MOV R0,R1
MOV #3,R3
151056$:CLC
ROR R1
SOB R3,151056$
BIC #1,R1
MOV R1,22(R4)
MOV R1,12(R4)
ADD R1,23604
MOV 0(R4),R3
CALL 147732$
MOV 23636,16(R4)
MOV 23636,23562
MOV #1,R2
BIC #177760,R0
BEQ 151150$
151142$:CLC
ROL R2
SOB R0,151142$
151150$:MOV R2,@23604
MOV R2,23622
CALL 151166$
RETURN
151166$:MOV SP,23656
MOV 23624,R1
MOV 22(R1),R0
MOV R0,23616
MOV R0,23620
MOV 6(R1),R2
ADD R0,R2
ADD 23562,R0
MOV R0,-(SP)
MOV R2,-(SP)
MOV R3,-(SP)
CALL 147760$
TST R4
BNE 151246$
JMP 151640$
151246$:MOV 23622,R5
CALL 150136$
TST R4
BNE 151266$
JMP 151640$
151266$:MOV R4,(R2)+
ADD #2,R0
BIT #100000,R4
BEQ 151374$
MOV 23476,R5
SUB 23616,R5
ASR R5
DEC R5
BEQ 151374$
151320$:CALL 147760$
CMP R4,#-1
BNE 151352$
MOV R4,(R2)+
ADD #2,R0
ADD #2,23620
SOB R5,151320$
BR 151374$
151352$:MOV #1,R5
CALL 150136$
MOV R4,(R2)+
BEQ 151374$
ADD #2,23620
151374$:MOV (SP)+,R3
MOV (SP)+,R2
MOV (SP)+,R0
BIT #1,@R2
BEQ 151474$
MOV 23616,R5
ASR R5
BEQ 151474$
151420$:SUB #2,R0
CALL 147760$
CMP R4,#-1
BNE 151452$
MOV R4,-(R2)
151440$:SUB #2,23616
SOB R5,151420$
BR 151474$
151452$:MOV #100000,R5
CALL 150136$
MOV R4,-(R2)
BEQ 151474$
SUB #2,23616
151474$:MOV 23616,22(R1)
MOV 23620,12(R1)
MOV 0(R1),R3
DEC R3
BLE 151634$
CALL 147732$
CALL 150576$
MOV R3,0(R4)
MOV #23564,R5
CALL 150246$
MOV 12(R1),R5
SUB 22(R1),R5
ASR R5
INC R5
MOV 6(R1),R2
MOV 23564,R3
ADD 22(R1),R2
ADD 22(R1),R3
151600$:MOV (R2)+,(R3)+
SOB R5,151600$
MOV 22(R1),24(R4)
MOV 12(R1),14(R4)
MOV 23564,10(R4)
MOV 23636,20(R4)
151634$:CLC
BR 151646$
151640$:MOV 23656,SP
SEC
151646$:RETURN
151650$:CALL 147662$
CALL 151756$
MOV #-1,23634
CALL 145624$
MOV 23646,R1
MOV 23644,R0
CALL 176300$
CALL 147706$
RETURN
151714$:CALL 147662$
CALL 151756$
CLR 23634
CALL 145624$
MOV 23646,R1
MOV 23644,R0
CALL 176300$
CALL 147706$
RETURN
151756$:MOV 23414,23652
INC 23652
MOV 23416,23654
INC 23654
MOV 23442,R1
CLR 23464
ROR R1
SBC 23464
CLR 23466
ROR R1
SBC 23466
CLR 23470
ROR R1
SBC 23470
MOV 23450,R1
NEG R1
MOVB R1,177016
MOV 23432,23504
MOV 22664,23474
MOV 23412,23500
BIC #17,23500
MOV 23500,23476
ASR 23476
ASR 23476
ASR 23476
MOV 23476,23502
ASR 23502
RETURN
152144$:MOV #5322,R0
CALL 176132$
MOV R0,23644
MOV R1,23646
MOV 23644,R1
ASR R1
SUB 23476,R1
BLE 152456$
MOV 23502,R2
ADD #13,R2
CLR R3
BR 152216$
152214$:INC R3
152216$:SUB R2,R1
BGT 152214$
TST R3
BEQ 152456$
CMP R3,#31
BLE 152240$
MOV #27,R3
152240$:MOV R3,23650
MOV 23646,R1
INC R1
BIC #1,R1
MOV 23502,R2
MOV R1,23566
152266$:CLR (R1)+
SOB R2,152266$
MOV R1,23570
MOV 23502,R2
152302$:CLR (R1)+
SOB R2,152302$
MOV R1,-(SP)
MOV #23510,R2
MOV R2,R1
MOV R2,23506
MOV #11,R3
152326$:CLR (R1)+
SOB R3,152326$
MOV #10000,(R1)+
MOV #10000,(R1)+
MOV (SP)+,R1
MOV 23650,R5
DEC R5
BEQ 152402$
152354$:MOV R1,@R2
MOV R1,R2
MOV #11,R3
152364$:CLR (R1)+
SOB R3,152364$
MOV #10000,(R1)+
MOV #10000,(R1)+
SOB R5,152354$
152402$:MOV #23536,R2
MOV 23650,R5
152412$:MOV R1,@R2
MOV R1,R2
MOV 23502,R3
152422$:CLR (R1)+
SOB R3,152422$
SOB R5,152412$
MOV #23540,R1
CLR (R1)+
MOV #23546,(R1)+
CLR (R1)+
CLR (R1)+
CLR (R1)+
MOV #23540,@R1
BR 152460$
152456$:SEC
152460$:RETURN
Автор: SuperMax 29.1.2021, 1:23
Код
; *****************************************************************
; * *
; * ПРОГРАММА НАЧАЛЬНОГО ЗАПУСКА СИСТЕМЫ, ПУЛЬТОВЫЙ МОНИТОР, *
; * ЗАГРУЗЧИКИ, ТЕСТОВЫЕ ПОДПРОГРАММЫ, ОБРАБОТЧИКИ ПРЕРЫВАНИЙ *
; * *
; * Адреса 160000 - 176673 *
; * *
; *****************************************************************
; *****************************************************************
; * *
; * Системные команды, выполняемые только в режиме HALT *
; * *
; * Мнемоника Код Выполняемое действие *
; * *
; * $MFPC$ 22 Копия счетчика команд --> R0 *
; * $MFPS$ 24 Копия слова состояния --> R0 *
; * $MTPC$ 32 R0 --> Копия счетчика команд *
; * $MTPS$ 34 R0 --> Копия слова состояния *
; * $MFPM$ 21 (R5)+ --> R0 (режим USER) *
; * $MTPM$ 31 R0 --> -(R5) (режим USER) *
; * $STEP$ 16 Копия счетчика команд --> PC *
; * Копия слова состояния --> PS *
; * Запуск по значению PC с маскировкой *
; * всех прерываний на один шаг *
; * $RUN$ 12 Копия счетчика команд --> PC *
; * Копия слова состояния --> PS *
; * Запуск по значению PC *
; *****************************************************************
$MFPC$ = 22
$MFPS$ = 24
$MTPC$ = 32
$MTPS$ = 34
$MFPM$ = 21
$MTPM$ = 31
$STEP$ = 16
$RUN$ = 12
.=160000
160000$:.WORD 160300$,200 ; Вектор прерывания по включению питания
160004$:.WORD 160230$,600 ; Вектор прерывания по зависанию (HALT)
160010$:.WORD 165612$,600 ; Вектор прерывания по инструкции FIS
; Адреса подпрограмм обработки прерываний EMT 14 - EMT 24
160014$:.WORD 173502$,160270$,103564$,104132$,104132$
; "Пустые" адреса
160026$:.REPT 5
.WORD 160270$
.ENDR
; Адреса подпрограмм обработки прерываний EMT 40 - EMT 76
160040$:.WORD 107754$,117126$,117162$,117174$
.WORD 117406$,117250$,117410$,117240$
.WORD 117412$,117414$,117416$,117420$
.WORD 117422$,160270$,117424$,117426$
; "Пустые" адреса
160100$:.REPT 30
.WORD 160270$
.ENDR
; Адреса подпрограмм обработки прерываний TRAP 0 - TRAP 6
160160$:.WORD 174254$,175516$,175664$,160270$
160170$:.WORD 160240$,600 ; Вектор прерывания по команде HALT
160174$:.WORD 160250$,600 ; Вектор прерывания по двойному зависанию
; Точка входа обработчика прерывания 4
160200$:MOV #163627$,@172662$
BR 160266$
; Точка входа обработчика прерывания 10
160210$:MOV #163641$,@172662$
BR 160614$
; Точка входа обработчика прерывания 24
160220$:MOV #163657$,@172662$
BR 160614$
; Точка входа обработчика прерывания 160004
160230$:MOV #163627$,@172662$
BR 160574$
; Точка входа обработчика прерывания 160170
160240$:MOV #163731$,@172662$
BR 160614$
; Точка входа обработчика прерывания 160174
160250$:MOV #163707$,@172662$
BR 160614$
; Точка входа обработчика прерывания 160274
160260$:MOV #163736$,@172662$
160266$:BR 160614$
160270$:RETURN
160272$:.WORD 161236$ ; Адрес п/п снятия режима HALT (для ЦП)
160274$:.WORD 160260$,600 ; Вектор прерывания по зависанию при приеме АВП
; Точка входа при включении питания (адрес начального пуска)
160300$:MOV @#172660$,R4 ; R4 = адрес ОЗУ пультового отладчика
CLR R0 ; Признак ошибок = 0
MOV R4,SP
BMI 160464$ ; Запуск в ЦП
BIT #20,@#177716 ; ЦП в режиме HALT ?
BEQ 160332$ ; Нет
MOV @#0,R0
BEQ 160332$
JMP @R0
160332$:MOV #40,@#177716 ; Останов ЦП (установка DCLO и ACLO)
CALL 173252$ ; Перекачка пультового монитора в сист. ОЗУ ЦП
MOV #70045,@#177010; Передача ключа теста памяти (делать или нет)
MOV 42(R4),@#177014
CLR @#177716 ; Снятие DCLO
MOV #100,R0
160370$:SOB R0,160370$ ; Задержка
MOV #100000,@#177716; Запуск ЦП (снятие ACLO)
CALL 160410$ ; Тест ПЗУ ПП
SWAB R0
BR 160474$ ; Переход на тест ОЗУ
; Подпрограмма теста ПЗУ ПП
160410$:MOV #4,R5 ; R5 = число банков ПЗУ
MOV #176776,R1 ; R1 = конечный адрес ПЗУ
MOV #7377,R2 ; R2 = число слов последнего банка ПЗУ
CLR R0 ; Очистка признака ошибок
160426$:ASL R0 ; Освободить правый бит
CLR R3
160432$:ADD -(R1),R3 ; Вычисление контрольной суммы
ADC R3
SOB R2,160432$
ASL R5
CMP <176770$-2>(R5),R3 ; Сравнение с записанной в ПЗУ
BEQ 160452$ ; Совпадает
INC R0 ; Установить правый бит
160452$:ASR R5
MOV #10000,R2 ; R2 = число слов в 1,2 и 3 банках ПЗУ
SOB R5,160426$
RETURN
160464$:CMP 42(R4),#125252 ; Производить тест ОЗУ
BEQ 160534$ ; Нет
160474$:CLR R1 ; R1 = начальный адрес
MOV @#172674$,R2 ; R2 = объем ОЗУ в словах
160502$:MOV R1,@R1 ; Занести в ячейку ее адрес
CMP R1,@R1 ; Сравнить
BNE 160530$ ; Ошибка
COM @R1 ; Инвертировать содержимое ячейки
MOV @R1,R3 ; R3 = содержимое ячейки
COM R3
CMP R1,R3 ; Содежимое R3 равно адресу
BNE 160530$ ; Нет (ошибка)
CLR (R1)+ ; Очистить ячейку
SOB R2,160502$
BR 160534$
160530$:BIS #2,R0 ; Установить признак ошибки ОЗУ
160534$:MOV R4,R1 ; R1 = адрес ОЗУ пультового отладчика
MOV #50,R2 ; R2 = объем ОЗУ пультового отладчика
160542$:CLR (R1)+ ; Цикл очистки
SOB R2,160542$
MOV @#172672$,14(R4); Начальное значение указателя стека
MOV #200,20(R4) ; Начальное значение слова состояния
MOV #125252,42(R4) ; Ключ пропуска теста ОЗУ
JMP 172676$
160574$:BR 160744$
; Точка перехода из режима УСТАНОВКА при нажатии УПР-@ (пультовый монитор ПП)
160576$:MOV #600,-(SP) ; Записать в стек слово состояния
MOV #160744$,-(SP) ; Записать в стек адрес начала пульт. отл.
CLR @172662$ ; Адрес выводимой надписи = 0
RTI ; Переход в пультовый отладчик
; Точка входа при обработке системных прерываний (адрес векторов 160***)
160614$:CLR @172664$ ; Адрес открытой ячейки = 0
MOV R0,@172660$ ; Сохранить содержимое R0
MOV @#172660$,R0 ; R0 = адрес буфера сохранения
TST (R0)+
MOV R1,(R0)+ ; Сохранить содержимое других регистров
MOV R2,(R0)+
MOV R3,(R0)+
MOV R4,(R0)+
MOV R5,(R0)+
MOV SP,(R0)+
MOV R0,R1
$MFPC$ ; Прочесть КРСК
MOV R0,(R1)+ ; Сохранить содержимое PC
MOV R0,R3 ; R3 = PC
$MFPS$ ; Прочесть КРСП
MOV R0,(R1)+ ; Сохранить содержимое PS
MOV @#172660,R1
MOV R1,R4 ; R4 = начальный адрес ОЗУ пультового отладчика
ADD 34(R4),PC ; Режим STEP/RUN ?
BR 160744$ ; STEP
160676$:MOV #4,R2 ; R2 = число точек останова
SUB #2,R3 ; R3 = предполагаемый адрес останова
160706$:MOV 50(R1),R5 ; R5 = адрес точки останова
BEQ 160736$ ; Отсутствует
MOV 60(R1),R0 ; R0 = значение яч. памяти по адресу останова
ADD #2,R5
$MTPM$ ; Запись значения в ОЗУ
CMP R3,R5 ; Текущий адрес останова = точке останова ?
BNE 160736$ ; Нет
MOV R3,16(R4) ; PC = подкоррект. адрес останова
160736$:ADD #2,R1 ; Переход к следующей точке останова
SOB R2,160706$
160744$:MOV @#172660$,R4 ; R4 = начальный адрес ОЗУ пультового отладчика
MOV R4,SP
BMI 160762$ ; Исполнение в ЦП
MOV #2,@#22550 ; Запрет перевода ЦП в режим HALT при Esc Гр-]
160762$:MOV #70,26(R4) ; Установка указателя на начало буфера
ADD R4,26(R4)
MTPS @#172670$ ; Установка ССП
JSR R4,163006$ ; Установка системного режима клавиатуры
.WORD 163476$
TST R4 ; Программа исполняется под упр. ПП ?
BPL 161030$ ; Да
MOV 36(R4),R0 ; R0 = выход в меню загрузки/монитор
MOV #2,36(R4) ; Установка выхода в монитор
ADD R0,PC
BR 161160$ ; Переход на вывод меню загрузки
161030$:CALL 163316$ ; Вывод причины останова, адр. ячейки и ее сод.
161034$:MOV R4,SP
JSR R4,163006$ ; Вывод промптера /@ /
.WORD 163510$
161044$:CALL 162602$ ; Набор восьм. значения и запрос ком. клавиши
BIC #240,R0 ; Привести к верхнему регистру
BNE 161062$ ; Нажат не <Пробел>
JMP 161606$ ; Нажат <Пробел>
161062$:CMPB R0,#3 ; Нажата комбинация УПР-C
BEQ 161206$
CMP R0,#14 ; Нажат <СБРОС>
BEQ 161300$
CMP R0,#15 ; Нажат <Enter>
BEQ 161034$
CMP R0,#33 ; Код <Escape>
BEQ 161306$
CMP R0,#'R ; R (переключение на регистры)
BEQ 161320$
CMP R0,#'A ; A (переключение на точки останова)
BEQ 161330$
CMP R0,#'M ; M (выход в меню)
BEQ 161160$
CMP R0,#'T ; T (тест сетевого адаптера)
BEQ 161154$
CMP R0,#'D ; D (переход в автономный режим)
BNE 161034$
161150$:JMP 161530$
161154$:JMP 162460$
; Обработка вызова меню загрузки (M)
161160$:JSR R4,163006$ ; Вызов меню загрузки
.WORD 163505$
CALL 172614$ ; Прочесть данные из канала 0 (номер пункта)
MOV R0,R1 ; R1 = номер выбранного пункта * 2
CALL 172614$ ; Прочесть данные из канала 0 (номер уст-ва)
CALL @162350$(R1) ; Вызов соответствующей п/п
BR 161160$
; Обработка выхода из пультового отладчика (УПР-C)
161206$:TST R4 ; Пультовый монитор работает под упр. ПП ?
BMI 161034$ ; Нет
CLR @#22550
MTPS #600
MOV @#7144,SP ; Восстановить стек режима УСТАНОВКА
CLR R0
$MTPS$ ; PS = 0
$MTPC$ ; PC = 0
$RUN$ ; Запуск по адресу 0(там RETURN, возврат в УСТ)
; П/п снятия в ЦП сигнала HALT
161236$:MOV R0,-(SP)
MOV R1,-(SP)
MOV R4,-(SP)
MOV @#172660$,R4 ; R4 = начальный адрес ОЗУ пультового отладчика
INC 44(R4) ; Установить ключ продолжения
JSR R4,163006$ ; Снять сигнал HALT в ЦП
.WORD 163501$
161262$:TST 44(R4) ; Ключ продолжения сброшен ?
BNE 161262$ ; Нет
MOV (SP)+,R4
MOV (SP)+,R1
MOV (SP)+,R0
RETURN
; Обработка команды очистки экрана (<СБРОС>) (R0 = 14)
161300$:CALL 172632$ ; Вывод символа УПР-L
BR 161034$
; Обработка клавиш с префиксом Esc
161306$:CALL 162756$ ; Прочесть очер. код клавиши с его коррекцией
CALL @161556$(R0) ; Вызвать соответствующую п/п
BR 161044$
; Обработка команды переключения на регистры (R)
161320$:MOV #10*400+'R,32(R4); Режим работы (10(8) регистров)
BR 161336$
; Обработка команды переключения на точки останова (A)
161330$:MOV #4*400+'A,32(R4); Режим работы (4 точки останова)
161336$:CALL 163370$ ; Перевод курсора на новую строку
MOVB 32(R4),R0 ; R0 = 'A' или 'R'
CALL 172632$ ; Вывод символа
161352$:CALL 172614$ ; Ввод символа с клавиатуры
MOV R0,R3
SUB #60,R3 ; R3 в диапазоне '0' -- '7'
BMI 161402$ ; Нет
CMPB R3,#7
BLOS 161410$ ; В диапазоне
CMP R0,#'S ; Нажата 'S' ?
BEQ 161470$ ; Да
161402$:CALL 163142$ ; Вывод всех регистров или точек останова
BR 161034$
161410$:BICB 33(R4),R0
CALL 172632$ ; Вывод номера регистра или точки останова
161420$:CALL 163234$ ; Вывод '=' и содержимого регистра
161424$:JSR R4,163006$ ; Вывод двух пробелов
.WORD 163560$
CALL 162604$ ; Ввод восьм. числа и запрос ком. клавиши
CMP R0,#33 ; Ком. клавиша имеет префикс Esc ?
BNE 161512$ ; Нет
CALL 162756$ ; Прочесть постфикс ком. клавиши и подкорр. его
SUB #2,R0
BMI 161524$ ; Нажата клавиша <ПОМ>
CALL 163264$ ; Получение адреса буфера
CALL @162222$(R0) ; Вызов соответствующей п/п
BR 161424$
161470$:CMPB 32(R4),#'R ; Работа производится с регистрами ?
BNE 161352$ ; Нет
CALL 172632$ ; Вывод символа 'S' (R0 = 'S')
MOV #10,R3 ; R3 = номер регистра (PS)
BR 161420$
161512$:CMP R0,#40 ; Нажат <Пробел> ?
BNE 161524$ ; Нет
JMP 161606$ ; Да
161524$:JMP 161062$
; Обработка команды перехода в автономный режим (D)
161530$:MOV #14,R0 ; R0 = Ctrl+L (очистка экрана)
161534$:CALL 172632$ ; Вывести символ на экран
CALL 172614$ ; Ввести символ с клавиатуры
CMP R0,#3 ; Нажата комбинация УПР+C ?
BNE 161534$ ; Нет
JMP 161034$ ; Переход в пультовый монитор
; Адреса п/п обработки клавиш с префиксом Esc (ПОМ,ИСП,Вверх,Вниз,Влево,
; Вправо,НР+Вверх,НР+Вниз,НР+Влево,НР+Вправо,?,?)
161556$:.WORD 162572$,161612$,161762$,161770$
.WORD 161772$,162026$,162132$,162040$
.WORD 162132$,162046$,162164$,162204$
; Обработка команды "шаг" (<Пробел>)
161606$:CLR R3 ; R3 = режим STEP
BR 161616$
; Обработка команды "пуск" (<ИСП>)
161612$:MOV #2,R3 ; R3 = режим RUN
161616$:MTPS #600
MOV 20(R4),R0 ; R0 = PS
$MTPS$ ; Запись КРСП
TST R2 ; Было набрано значение ?
BEQ 161640$ ; Нет
MOV R1,16(R4) ; Сохранить набранное значение
161640$:MOV 16(R4),R0 ; R0 = PC
$MTPC$ ; Запись КРСК
MOV R3,34(R4) ; Сохранение режима STEP/RUN
BEQ 161724$ ; Режим STEP
MOV R4,R1 ; R1 = начальный адрес ОЗУ пультового отладчика
MOV #4,R2 ; R2 = число точек останова
161662$:MOV 50(R1),R5 ; R5 = адрес точки останова
BEQ 161712$ ; Точка останова не используется
$MFPM$ ; Чтение содерж. памяти по адресу останова
MOV R0,60(R1) ; Сохранение его в буфере
CMP 16(R4),50(R1) ; Адрес останова равен адресу запуска ?
BEQ 161712$ ; Да
CLR R0 ; R0 = код команды HALT
$MTPM$ ; Запись его в память по адресу останова
161712$:ADD #2,R1 ; Переход к следующей точке останова
SOB R2,161662$
CALL 161236$ ; Снятие в ЦП сигнала HALT
161724$:MOV R4,SP ; SP = начальный адрес ОЗУ пультового отладчика
BMI 161734$ ; Пультовый отладчик работает под управл. ЦП
CLR @#22550
161734$:MOV (SP)+,R0 ; Восстановление регистров
MOV (SP)+,R1
MOV (SP)+,R2
MOV (SP)+,R3
MOV (SP)+,R4
MOV (SP)+,R5
MOV (SP)+,SP
ADD @172666$,PC ; Режим STEP/RUN
$STEP$
$RUN$
; Обработка команды "открыть предыдущую ячейку" (Вверх)
161762$:MOV #-2,R3
BR 161772$
; Обработка команды "открыть следующую ячейку" (Вниз)
161770$:TST (R3)+ ; R3 = 2
; Обработка команды "занести значение" (Влево)
161772$:TST R2 ; Значение было введено ?
BEQ 162014$ ; Нет
MOV R1,R0 ; R0 = введенное число
MOV 22(R4),R5 ; R5 = адрес открытой ячейки
ADD #2,R5
CALL 163444$ ; Занести значение в память
162014$:ADD R3,22(R4) ; Переход к другой ячейке
162020$:CALL 163024$ ; Прочитать ее содерж. и вывести на экран
RETURN
; Обработка команды "открыть ячейку" (Вправо)
162026$:TST R2 ; Значение было введено ?
BEQ 162020$ ; Нет
MOV R1,22(R4) ; Изменить адрес открытой ячейки
BR 162020$
; Обработка команды "открыть ячейку с относительным адресом" (НР+Вниз)
162040$:MOV #2,R3 ; R3 = признак относительного адреса
BR 162050$
; Обработка команды "открыть ячейку с абсолютным адресом" (НР+Вправо)
162046$:CLR R3 ; R3 = признак абсолютного адреса
162050$:TST R2 ; Значение было введено ?
BEQ 162062$ ; Нет
MOV R1,@26(R4) ; Сохр. введ. знач. в качестве адреса возврата
BR 162070$
162062$:MOV 22(R4),@26(R4) ; Сохр. в кач. адреса возв. адрес откр. ячейки
162070$:ADD #2,26(R4) ; Передвинуть указатель буфера сохранения
BIC #20,26(R4)
MOV 24(R4),R0 ; R0 = содержимое открытой ячейки
TST R3 ; Режим относительного адреса ?
BNE 162122$ ; Да
MOV R0,22(R4) ; Адрес = содерж. открытой ячейки (абс. адр.)
BR 162020$
162122$:ADD R3,R0
ADD R0,22(R4) ; Адрес += содерж. откр. яч + 2 (относ. адр.)
BR 162020$
; Обработка команды "возврат на пред. уровень косв. адр." (НР+Вверх, НР+Влево)
162132$:SUB #2,26(R4) ; Передвинуть назад указатель буфера сохр.
BIS #100,26(R4)
BIC #20,26(R4)
MOV @26(R4),22(R4) ; Адрес = сохраненный адрес
BR 162020$
; Подпрограмма переключения на просмотр памяти ЦП
162164$:TST R4 ; Пульт. отладчик работает под упр. ЦП ?
BMI 162202$ ; Да
MOV #4,40(R4) ; Режим просмотра памяти ЦП
EMT 52 ; Вывод строки "ЦМ"
.WORD 107560$
162202$:RETURN
; Подпрограмма переключения на просмотр памяти ПП
162204$:TST R4 ; Пульт. отладчик работает под упр. ЦП ?
BMI 162220$ ; Да
CLR 40(R4) ; Режим просмотра памяти ПП
EMT 52 ; Вывод строки "ПМ"
.WORD 107551$
162220$:RETURN
; Адреса п/п обработки клавиш с префиксом Esc для режима рег./точек останова
; (ИСП, Вверх, Вниз, Влево, Вправо, НР+Вверх, НР+Вниз, НР+Влево, НР+Вправо,?,?)
162222$:.WORD 161612$,162250$,162262$,162304$,162320$
.WORD 162342$,162334$,162342$,162326$,162164$,162204$
; Обработка команды "открыть предыдущий регистр/точку останова" (Вверх)
162250$:TST R2 ; Значение было введено ?
BEQ 162256$ ; Нет
MOV R1,@R5 ; Занести введенное значение в рег./точку ост.
162256$:DEC R3 ; Перейти к предыдущему регистру/точке останова
BR 162272$
; Обработка команды "открыть следующий регистр/точку останова" (Вниз)
162262$:TST R2 ; Значение было введено ?
BEQ 162270$ ; Нет
MOV R1,@R5 ; Занести введенное значение в рег./точку ост.
162270$:INC R3 ; Перейти к следующему регистру/точке останова
162272$:BIC #177770,R3 ; Подкорректировать номер рег./точки останова
BICB 33(R4),R3
BR 162312$
; Обработка команды "занести значение в регистр/точку останова" (Влево)
162304$:TST R2 ; Значение было введено ?
BEQ 162312$ ; Нет
MOV R1,@R5 ; Занести введенное значение в рег./точку ост.
162312$:CALL 163174$ ; Вывод содержимого другого рег./точки ост.
RETURN
; Обработка команды "открыть ячейку" (Вправо)
162320$:MOV #161044$,@SP ; Коррекция адреса возврата
BR 162026$ ; На исполнение команды
; Обработка команды "открыть ячейку с абсолютным адресом" (НР+Вправо)
162326$:MOV #161044$,@SP ; Коррекция адреса возврата
BR 162046$ ; На исполнение команды
; Обработка команды "открыть ячейку с относительным адресом" (НР+Вниз)
162334$:MOV #161044$,@SP ; Коррекция адреса возврата
BR 162040$ ; На исполнение команды
; Обработка команды "возврат на пред. ур. косв. адр." (НР+Вверх, НР+Влево)
162342$:MOV #161044$,@SP ; Коррекция адреса возврата
BR 162132$ ; На исполнение команды
; Адреса подпрограмм исполнения пунктов меню ЗАГРУЗКА (не выбрано,
; диск, кассета ПЗУ, сеть, стык С2, магнитофон, отладка, тестирование)
162350$:.WORD 162572$,162400$,162420$,162440$,162472$,162504$,161034$,162370$
; Обработка пункта меню ЗАГРУЗКА [тестирование]
162370$:CALL 161236$ ; Перевод ЦП в режим USER
JMP 167540$ ; На исполнение тестов
; Обработка пункта меню ЗАГРУЗКА [диск]
162400$:MOV R0,R3 ; R3 = номер диска (0 -- 3)
JSR R5,162522$ ; Перекачка загрузчика и его запуск
.WORD 163774$,44,164104$,5,0
; Обработка пункта меню ЗАГРУЗКА [кассета ПЗУ]
162420$:MOV R0,R3 ; R3 = номер кассеты ПЗУ (1 -- 2)
JSR R5,162522$ ; Перекачка загрузчика и его запуск
.WORD 163774$,44,164116$,5,0
; Обработка пункта меню ЗАГРУЗКА [сеть]
162440$:JSR R4,163006$ ; Вывод "* ЗАГРУЗКА ИЗ СЕТИ *"
.WORD 163573$ ; Адрес надписи
JSR R5,162522$ ; Перекачка загрузчика и его запуск
.WORD 164160$,210,0
; Обработка команды "Т" пультового монитора (тест локальной сети)
162460$:JSR R5,162522$ ; Перекачка программы теста и ее запуск
.WORD 164600$,360,0
; Обработка пункта меню ЗАГРУЗКА [стык С2]
162472$:JSR R5,162522$ ; Перекачка загрузчика и его запуск
.WORD 165540$,25,0
; Обработка пункта меню ЗАГРУЗКА [магнитофон]
162504$:JSR R5,162522$ ; Перекачка загрузчика и его запуск
.WORD 163774$,44,164130$,14,0
; Подпрограмма перекачки загрузчика из сист. ОЗУ и его запуск
162522$:MOV #1000,R0 ; R0 = адрес, куда перекачивается загрузчик
162526$:MOV (R5)+,R1 ; R1 = адрес загрузчика в сист. ОЗУ
BEQ 162542$ ; Конец перекачки
MOV (R5)+,R2 ; R2 = размер загрузчика в словах
162534$:MOV (R1)+,(R0)+ ; Цикл перекачки
SOB R2,162534$
BR 162526$
162542$:CALL 161236$ ; Перевод ЦП в режим USER
MOV #200,R0 ; Копия ССП = 200 (прерывания запрещены)
$MTPS$
MOV #1000,R0 ; Копия СК = 1000 (адрес загрузчика)
$MTPC$
MOV #1000,SP
MOV R3,R0 ; R0 = номер устройства (диска или кассеты ПЗУ)
$RUN$ ; Запуск загрузчика
162572$:RETURN
; Подпрограмма ввода восьмеричного значения и запроса командной клавиши
162574$:MOV @#172660,R4 ; R4 = начало ОЗУ пультового монитора
BR 162604$
162602$:CLR R3
162604$:MOV R4,R1
ADD #110,R1 ; R1 = адрес буфера для ввода чисел
CLR R2 ; R2 = 0 (инициализация счетчика введ. цифр)
162614$:CALL 172614$ ; Запрос нажатой клавиши
CMP R0,#'0 ; Введенный символ в диапазоне '0'-'7' ?
BLO 162706$ ; Нет
CMP R0,#'7
BHI 162654$ ; Нет
CMP R2,#8. ; Введено восемь цифр ?
BEQ 162614$ ; Да
MOVB R0,(R1)+ ; Поместить символ в буфер
INC R2 ; Увеличить счетчик символов
CALL 172632$ ; Вывести символ на экран
BR 162614$
162654$:CMPB R0,#177 ; Нажата клавиша <ЗАБОЙ> ?
BNE 162706$ ; Нет
TST R2 ; Буфер пуст ?
BEQ 162614$ ; Да
CLRB -(R1) ; Удалить последний символ из буфера
DEC R2 ; Уменьшить счетчик введенных символов
MOV R1,-(SP)
JSR R4,163006$ ; Удалить последний символ с экрана
.WORD 163551$
MOV (SP)+,R1
BR 162614$
162706$:SUB R2,R1 ; R1 = начало буфера ввода
CLR R2 ; R2 = 0 (счетчик обработанных символов)
CLR R5 ; R5 = 0 (введенное число (инициализация))
MOV R0,-(SP) ; Сохранить в стеке код командной клавиши
162716$:MOVB @R1,R0 ; R0 = очередная цифра из буфера
CLRB (R1)+
SUB #60,R0 ; Перевод из ASCII в BIN
BMI 162750$ ; Достигнут конец буфера
ASL R5 ; R5 = R5 * 8 + R0
ASL R5
ASL R5
ADD R0,R5
INC R2 ; Увеличить счетчик обработанных символов
CMP R2,#8. ; Обработано восемь символов ?
BNE 162716$ ; Нет
162750$:MOV (SP)+,R0 ; R0 = код командной клавиши
MOV R5,R1 ; R1 = введенное значение
RETURN
; П/п ввода клавиши и корректировка ее кода (за символом ESC)
162756$:CALL 172614$ ; Запрос нажатой клавиши
SUB #176,R0 ; Ее код в диапазоне 176(8) -- 207(8) ?
BMI 163002$ ; Нет
CMP R0,#11
BHI 163002$ ; Нет
ASL R0 ; Увеличение скорректированного кода вдвое
RETURN
163002$:CLR R0 ; R0 = 0 ("плохой" код)
RETURN
; Подпрограмма вывода строки на экран (адрес строки за командой JSR R4,...)
163006$:MOV (R4)+,R1 ; R1 = адрес строки
BR 163016$
163012$:CALL 172632$ ; Вывод символа на экран
; Подпрограмма вывода строки на экран (адрес строки в регистре R1)
163016$:MOVB (R1)+,R0 ; R0 = очередной символ
BNE 163012$ ; Еще не конец строки
RTS R4
; Подпрограмма вывода на экран адреса открытой ячейки памяти и ее содержимого
163024$:CALL 163370$ ; Перевод курсора в начало следующей строки
MOV 22(R4),R1 ; R1 = адрес открытой ячейки
CALL 163074$ ; Вывод на экран адреса открытой ячейки
JSR R4,163006$ ; Вывод разделительной дробной черты
.WORD 163516$
MOV 22(R4),R5 ; R5 = адрес открытой ячейки
CALL 163412$ ; Запрос содержимого ячейки
MOV R0,R1 ; R1 = содержимое открытой ячейки
CALL 163074$ ; Вывод на экран содержимого открытой ячейки
JSR R4,163006$ ; Вывод двух пробелов
.WORD 163560$
RETURN
; Подпрограмма вывода на экран числа в восьмеричной форме
163074$:MOV R1,24(R4) ; Сохранение значения в ОЗУ пульт. отладчика
CLR R0
MOV #6,R2 ; Число символов в ASCII-строке
BR 163122$
163110$:CLR R0 ; Цикл вытяжки трех старших разрядов R1 -> R0
ROL R1
ROL R0
ROL R1
ROL R0
163122$:ROL R1
ROL R0
ADD #'0,R0 ; Преобразование из BIN в ASCII
CALL 172632$ ; Вывод символа на экран
SOB R2,163110$
RETURN
; Подпрограмма вывода на экран регистров или точек останова
163142$:CALL 163370$ ; Перевод курсора в начало следующей строки
CLR R3 ; R3 = 0 (начальный номер рег. или точ.ост.)
163150$:CALL 163200$ ; Вывод содержимого регистра или точ. ост.
INC R3 ; Перейти к след. регистру или точ. ост.
CMPB R3,33(R4) ; Выведены все рег. или точ. ост.
BLO 163150$ ; Нет
CMP R3,#10 ; Номер регистра равен 10 (рег. сост. проц.) ?
BEQ 163150$ ; Да
RETURN
; Подпрограмма вывода на экран содерж. одного регистра или точки останова
163174$:CALL 163370$ ; Перевод курсора в начало следующей строки
163200$:MOVB 32(R4),R0 ; R0 = 'R' или 'A' (регистры или точ. ост.)
CALL 172632$ ; Вывод символа на экран
MOV R3,R0 ; R0 = номер регистра или точ. ост.
ADD #'0,R0 ; Перевод из BIN в ASCII
CMP R0,#'8 ; Это регистр состояния процессора
BNE 163230$ ; Нет
MOV #'S,R0 ; Замена '8' на 'S'
163230$:CALL 172632$ ; Вывод символа на экран
163234$:JSR R4,163006$ ; Вывод знака равенства
.WORD 163526$
CALL 163264$ ; Получение в R5 адреса хранения знач. рег.
MOV @R5,R1 ; R1 = содержимое регистра или точ. ост.
CALL 163074$ ; Вывод содержимого на экран
JSR R4,163006$ ; Вывод разделительного пробела
.WORD 163561$
RETURN
; Подпрограмма получения в R5 адреса хранения содержимого рег. или точ. ост.
163264$:CLR R5 ; R5 = 0 (инициализация)
CMPB 33(R4),#4 ; Идет вывод точек останова ?
BNE 163306$ ; Нет
BICB 33(R4),R3
MOV #24,R5 ; R5 = смещение знач. точ. ост. в ОЗУ ПО / 2
163306$:ADD R3,R5 ; Прибавить номер регистра или точки останова
ASL R5
ADD R4,R5 ; Прибавить адрес ОЗУ пультового отладчика
RETURN
; Подпрограмма вывода на экран причины перехода процессора в режим HALT
163316$:MOV @172662$,R2 ; R2 = адрес строки причины перехода
BEQ 163366$
JSR R4,163006$ ; Вывод "*** "
.WORD 163530$
MOV R2,R1 ; R1 = адрес строки причины перехода
JSR R4,163016$ ; Вывод причины перехода
JSR R4,163006$ ; Вывод " ***"
.WORD 163540$
TST 22(R4) ; Вывод содержимое ячейки останова ?
BNE 163366$ ; Нет
MOV 16(R4),22(R4) ; 22(R4) = адрес останова
CALL 163024$ ; Вывод содержимого ячейки адреса останова
163366$:RETURN
; Подпрограмма перевода курсора в начало следующей строки
163370$:MOV #15,R0 ; R0 = код возврата каретки
CALL 172632$ ; Вывод на экран (курсор в начало тек. строки)
MOV #12,R0 ; R0 = код перевода строки
CALL 172632$ ; Вывод на экран (курсор на след. строку)
RETURN
; Подпрограмма чтения содержимого ячейки памяти
163412$:ADD 40(R4),PC ; Режим ЦП(40(R4)=4)/ПП(40(R4)=0)(только в ПП)
$MFPM$ ; Чтение содержимого ячейки (R5)+ -> R0
RETURN
163422$:CLC ; Коррекция R5 для помещ. его в рег. адреса
ROR R5
MOV R5,@#177010
MOV @#177014,R0 ; Чтение содержимого ячейки памяти ЦП
INC R5
ASL R5
RETURN
; Подпрограмма записи значения в ячейку памяти
163444$:ADD 40(R4),PC ; Режим ЦП(40(R4)=4)/ПП(40(R4)=0)(только в ПП)
$MTPM$ ; Запись значения в ячейку памяти R0 -> -(R5)
RETURN
163454$:CLC ; Коррекция R5 для помещ. его в рег. адреса
ROR R5
DEC R5
MOV R5,@#177010
MOV R0,@#177014 ; Запись значения в ячейку памяти ЦП
ASL R5
RETURN
; Esc-последовательности и надписи, употребляемые пультовым отладчиком
163476$:.BYTE 33,275,0 ; Системный режим клавиатуры
163501$:.BYTE 33,277,275,0 ; Пользовательский режим клавиатуры
163505$:.BYTE 33,274,0 ; Вызов меню ЗАГРУЗКА
163510$:.ASCIZ <15><12><17>/@ /
163516$:.ASCIZ "/ "
163521$:.ASCIZ /R/
163523$:.ASCIZ /RS/
163526$:.ASCIZ /=/
163530$:.ASCIZ <15><12><16>/*** /
163540$:.ASCIZ / ***/<17>
163546$:.ASCIZ <15><12>
163551$:.ASCIZ <33>/D /<33>/D/
.EVEN
163560$:.ASCII / /
163561$:.ASCIZ / /
163563$:.ASCIZ <6>/ЦП/
163567$:.ASCIZ <6>/ПП/
163573$:.ASCIZ <15><12><12><16>/* zagruzka iz seti * /<17>
163627$:.ASCIZ /zawisanie/
163641$:.ASCIZ /rezerwnyj kod/
163657$:.ASCIZ /awariq setewogo pitaniq/
163707$:.ASCIZ /dwojnoe zawisanie/
163731$:.ASCIZ /stop/
163736$:.ASCIZ /zawisanie pri prieme a.w.p./
.EVEN
163772$:.WORD 0
; Загрузчик с диска, кассеты ПЗУ, магнитофона
163774$:MOV #176674,R1 ; R1 = адрес регистра сост. перед. канала 2
MOVB R0,164104$+3 ; Сохранить номер устройства
CLRB @R1 ; Запретить прерывания от канала 2
MOV #164104$-163774$+1000,R2; R2 = адрес блока параметров
164012$:MOV #2,R3
164016$:TSTB @R1 ; Ожидание готовности канала 2
BPL 164016$ ; Не готов
MOVB R2,2(R1) ; Передача адреса БП в канал 2
SWAB R2
SOB R3,164016$
MOV #2,R3
164036$:TSTB @R1 ; Ожидание готовности канала 2
BPL 164036$ ; Не готов
MOVB #377,2(R1) ; Передача байтов завершения в канал 2
SOB R3,164036$
164052$:TSTB @R1 ; Ожидание завершения операции
BPL 164052$ ; Операция не завершена
TSTB 164104$ ; Есть ошибки ?
BEQ 164072$ ; Нет
CLRB 164104$ ; Очистить байт ошибок
BR 164012$ ; Попробовать заново
164072$:CMP #240,@#0 ; Первая команда BOOT-сектора NOP ?
BNE 164012$ ; Нет
CLR PC ; Запуск BOOT
; Блок параметров для диска
164104$:.BYTE 0,10,2,0,0,1
.WORD 0,400
; Блок параметров для кассеты ПЗУ
164116$:.BYTE 0,10,21,0,0,0
.WORD 0,400
; Блок параметров для магнитофона
164130$:.BYTE 0,11,11,0
.WORD 0,0,0,0,0,0,0,0,0,400
; Загрузчик из сети
164160$:MTPS #340 ; Запретить прерывания
MOVB @#176561,R5 ; Выделение в R5 номера сетевой станции
MOV R5,R0
BIC #177760,R5
ASR R0
BIC #177717,R0
BIS R0,R5
MOVB R5,164554$+2 ; Сохранение номера сетевой станции
MOVB 164554$+16,R0 ; R0 = 173(8)
XOR R5,R0 ; R0 = 173(8) XOR номер_сетевой_станции
MOVB R0,164554$+16
MOV #30,R0 ; R0 = 30 (адрес вектора команды EMT)
MOV #164500$-164160$+1000,(R0)+; Установка вектора прерывания EMT
CLR (R0)+ ; Установка ССП при вызове EMT
MOV #164512$-164160$+1000,(R0)+; Установка вектора прерывания TRAP
CLR (R0)+ ; Установка ССП при вызове TRAP
164244$:MOV #10000,SP ; Установка указателя стека
MOV #164526$-164160$+1000,@#100; Устан. вект. прер. сет. таймера
CLR @#102
MTPS #0 ; Разрешить прерывания
CLR 164534$ ; Очистка счетчика ожидания
164272$:TRAP 0 ; Чтение пришедшего байта
CMP 164534$,#5 ; Счетчик ожидания больше пяти
BLO 164272$ ; Нет
164304$:EMT 0 ; Посылка и чтение очередного байта
CMPB #376,R0 ; Пришедший байт равен 376(8)
BNE 164304$ ; Нет
MOV #164554$-164160$+1000,R1; R1 = адрес блока передачи
164320$:MOVB (R1)+,R0 ; R0 = очередной байт из блока передачи
CMPB #376,R0 ; Он равен 376(8) ?
BEQ 164334$ ; Да
EMT 0 ; Посылка и чтение очередного байта
BR 164320$
164334$:EMT 0 ; Посылка и чтение очередного байта
CMPB #377,R0 ; Прочитанный байт равен 377(8) ?
BNE 164334$ ; Нет
EMT 0 ; Посылка и чтение очередного байта
CMPB R5,R0 ; Полученный байт равен номеру станции ?
BNE 164334$ ; Нет
MOV #377,R4 ; R4 = 377(8) (контрольная сумма)
XOR R0,R4 ; R4 = 377(8) XOR номер_сетевой_станции
MOV #50000,R1 ; R1 = адрес расположения загрузчика
EMT 0 ; Посылка и чтение очередного байта
MOV R0,R3 ; R3 = считанный байт
XOR R0,R4 ; Подсчет контрольной суммы
164372$:EMT 0 ; Посылка и чтение очередного байта
CMPB #373,R0 ; Считанный байт равен 373(8) ?
BLOS 164410$ ; Выше или равен 373(8)
XOR R0,R4 ; Подсчет контрольной суммы
MOVB R0,(R1)+ ; Передача принятого байта в память
BR 164372$
164410$:BNE 164426$ ; Принятый байт равен не равен 373(8)
EMT 0 ; Посылка и чтение очередного байта
COM R0 ; Инверсия принятого байта
XOR R0,R4 ; Подсчет контрольной суммы
MOVB R0,(R1)+ ; Передача принятого байта в память
COM R0 ; Инверсия для передачи
BR 164372$
164426$:CMPB #374,R0 ; Принятый байт равен 374(8)
BNE 164244$ ; Нет
EMT 0 ; Посылка и передача байта
CMPB R0,R4 ; Он равен контрольной сумме ?
BNE 164244$ ; Нет
EMT 0 ; Посылка и передача байта
BISB #10,R0 ; R0 = R0 OR 10(8)
EMT 0 ; Посылка и передача байта
CMPB #377,R0 ; Принятый байт равен 377(8)
BNE 164244$ ; Нет
EMT 0 ; Посылка и передача байта
MOV #4,@#176560 ; Включение кольцевой сети
MTPS #340 ; Запретить прерывания
JMP @#50000 ; Переход на исполнение загрузчика
; Подпрограмма передачи байта в локальную сеть (исполнение команды EMT)
164500$:TSTB @#176564 ; Передатчик СА готов ?
BPL 164500$ ; Нет
MOVB R0,@#176566 ; Передача байта в сеть
; Подпрограмма чтения байта, пришедшего по сети (исполнение команды TRAP)
164512$:TSTB @#176560 ; Приемник СА готов ?
BPL 164512$ ; Нет
MOVB @#176562,R0 ; Прием байта из сети
RTI
; Подпрограмма исполнения прерываний таймера
164526$:CLR @#176560 ; Включение режима загрузки
INC (PC)+ ; Инкремент счетчика ожидания
164534$:.WORD 0
CMP 164534$,#1000 ; Счетчик ожидания превысил лимит времени ?
BHI 164550$ ; Да
RTI
164550$:JMP 164244$
; Блок передачи в сеть
164554$:.BYTE 377,0,0,204,0,0,0,0,0,0,0,0,0,374,173,60,377,376,0,0
; Программа теста локальной сети
164600$:MTPS #340 ; Запретить прерывания
MOV #165130$-164600$+1000,@#360; Уст. вект. прер. приемника СА
MOV #165120$-164600$+1000,@#100; Уст. вект. прер. сет. таймера
MOV #165254$-164600$+1000,@#4; Уст. вект. прер. по ош. обр. к кан.
MOV #165264$-164600$+1000,@#10; Уст. вект. прер. по недейст. ком.
MOV #340,R0 ; Установить знач. ССП при вызове прер.
MOV R0,@#362
MOV R0,@#102
MOV R0,@#6
MOV R0,@#12
CLR (PC)+ ; Установить пассивный режим
164662$:.WORD 0
CALL 165304$ ; Вывести номер сетевой станции
MTPS #0 ; Разрешить прерывания
164674$:TSTB @#177560 ; Нажата клавиша ?
BPL 164674$ ; Нет
MOVB @#177562,R0 ; R0 = код нажатой клавиши
BIC #177600,R0
CMPB #3,R0 ; Нажата комбинация <УПР+C>
BNE 164726$ ; Нет
CALL 164744$ ; Запрос команды и ее исполнение
BR 164674$
164726$:TST 164662$ ; Режим активный или пассивный ?
BEQ 164674$ ; Пассивный режим
MOVB R0,R1 ; R1 = код нажатой клавиши
CALL 165104$ ; Посылка в сеть
BR 164674$
; Подпрограмма запроса команды и ее исполнение
164744$:TSTB @#177564 ; Готовность перед. канала 0 (терминал)
BPL 164744$ ; Не готов
MOVB #'?,@#177566 ; Вывести промптер '?'
164760$:TSTB @#177560 ; Нажата клавиша ?
BPL 164760$
MOVB @#177562,R0 ; R0 = код нажатой клавиши
BIC #177640,R0
CMPB R0,#'A ; Нажата 'A' (активный режим) ?
BEQ 165046$ ; Да
CMPB R0,#'P ; Нажата 'P' (пассивный режим) ?
BEQ 165056$ ; Да
CMPB R0,#'N ; Нажата 'N' (номер станции) ?
BEQ 165076$ ; Да
CMPB R0,#'K ; Нажата 'K' (конец теста) ?
BEQ 165064$ ; Да
TST 164662$ ; Активный/пассивный режим ?
BEQ 165102$ ; Пассивный режим
MOVB #3,R1
CALL 165104$ ; Посылка в сеть
BR 165102$
; Активный режим
165046$:MOV #1,164662$ ; Установить признак активного режима
BR 165102$
; Пассивный режим
165056$:CLR 164662$ ; Установить признак пассивного режима
BR 165102$
; Конец теста
165064$:MOV #165504$-164600$+1000,R5; Адрес строки "КОНЕЦ ТЕСТА"
CALL 165402$ ; Вывести на экран
HALT ; Выход в пультовый отладчик
; Номер станции
165076$:CALL 165304$ ; Вывести номер станции на экран
165102$:RETURN
; Подпрограмма передачи данных в сеть
165104$:TSTB @#176564 ; Передатчик готов ?
BPL 165104$ ; Нет
MOVB R1,@#176566 ; Послать байт в сеть
RETURN
; Подпрограмма обработки событий сетевого таймера
165120$:MOV #100,@#176560 ; Установить режим прерываний СА
RTI
; Подпрограмма обработки прерываний от СА
165130$:MOV R1,-(SP)
BIT #110001,@#176560; Есть ошибки передачи ?
BNE 165176$ ; Да
MOVB @#176562,R1 ; R1 = принятые данные
165146$:TSTB @#177564 ; Готовность терминала
BPL 165146$ ; Не готов
MOVB R1,@#177566 ; Вывести принятый символ на экран
TST 164662$ ; Активный/пассивный режим
BNE 165172$ ; Активный
CALL 165104$ ; Послать данные в сеть
165172$:MOV (SP)+,R1
RTI
165176$:MOV @#176560,R1 ; R1 = регистр состояния приемника СА
BPL 165210$ ; Ошибка паритета отсутствует
BIS #4,R1 ; Установить признак ошибки паритета
165210$:BIT #10000,R1 ; Есть ошибки переполнения ?
BEQ 165222$ ; Нет
BIS #2,R1 ; Установить признак переполнения
165222$:BIC #177770,R1 ; Выделить ошибку разрыва линии
BIS #60,R1 ; Перевод BIN -> ASCII
MOVB R1,165420$+7
MOV #165420$-164600$+1000,R5; Адрес сообщения "СБОЙ #X"
CALL 165402$ ; Вывести сообщение на экран
TSTB @#176562 ; Сбросить готовность приемника СА
BR 165172$
; Подпрограмма обработки прерывания 4 (ошибка обращения к каналу)
165254$:MOV #"04,165461$+15; Номер прерывания в сообщение
BR 165272$
; Подпрограмма обработки прерывания 10 (зарезервированная инструкция)
165264$:MOV #"10,165461$+15; Номер прерывания в сообщение
165272$:MOV #165461$-164600$+1000,R5; Адрес сообщения "ПРЕРЫВАНИЕ #XX"
CALL 165402$ ; Вывести сообщение на экран
HALT ; Переход в режим пультового отладчика
; Подпрограмма вывода на экран номера сетевой станции
165304$:MOVB @#176561,R0 ; Выделение номера станции, перевод
MOVB R0,R1 ; из BIN в ASCII и запоминание в строке
BICB #360,R0 ; "ТЕСТ СТАНЦИИ #XX"
BICB #237,R1
ASRB R1
BISB R1,R0
MOV R0,R1
BIC #177770,R1
BIS #60,R1
MOVB R1,165434$+20
MOV R0,R1
ASR R1
ASR R1
ASR R1
BIC #177770,R1
BIS #60,R1
MOVB R1,165434$+17
MOV #165434$-164600$+1000,R5; Адрес строки "ТЕСТ СТАНЦИИ #XX"
CALL 165402$ ; Вывести строку на экран
RETURN
; Подпрограмма вывода строки на экран
165402$:TSTB @#177564 ; Готовность к принятию символа
BPL 165402$ ; Не готов
MOVB (R5)+,@#177566 ; Вывести очередной символ на экран
BNE 165402$ ; Еще не конец строки
RETURN
165420$:.ASCIZ <16>/sboj #0/<17><15><12>
165434$:.ASCIZ <16>/test stancii #00/<17><15><12>
165461$:.ASCIZ <16>/prerywanie #00/<17><15><12>
165504$:.ASCIZ <16>/konec testa/<17><15><12>
.EVEN
165524$:.WORD 0,0,0,0,0,0
; Загрузчик из стыка С2
165540$:TSTB @#176574 ; Проверка готовности передатчика
BPL 165540$ ; Не готов
MOV #100,@#176576 ; Послать код 100(8) (готовность к обмену)
CLR R1 ; R1 = 0 (адрес считывания BOOT)
MOV #1000,R2 ; R2 = 1000 (размер BOOT)
165562$:TSTB @#176570 ; Приемник готов ?
BPL 165562$ ; Нет
MOVB @#176572,(R1)+ ; Переслать принятый байт в память
SOB R2,165562$
CMP @#0,#240 ; Первая команда BOOT равна NOP ?
BEQ 165610$ ; Да
HALT ; Переход в режим пультового отладчика
165610$:CLR PC ; Переход к исполнению BOOT
; Обработка команд FIS (FADD, FSUB, FMUL, FDIV)
165612$:MOV R2,@167502$ ; Сохранить R2
MOV 167502$,R2 ; R2 = адрес блока сохранения
ADD #2,R2
MOV R0,(R2)+ ; Сохранить регистры,СК и ССП
$MFPC$
MOV R0,14(R2)
$MFPS$
MTPS R0
MOV R0,16(R2)
MOV R1,(R2)+
MOV @167502$,(R2)+
MOV R3,(R2)+
MOV R4,(R2)+
MOV R5,(R2)+
MOV SP,(R2)+
MOV (R2)+,R5 ; R5 = Значение СК за командой FIS
SUB #2,R5 ; Получение адреса команды FIS
ADD #2,R2
$MFPM$ ; Прочесть код команды FIS
MOV R0,R1 ; R1 = код команды FIS
BIC #177770,R0 ; Выделение поля регистра
ASL R0 ; Доступ к сохр. значению регистра
ADD 167502$,R0
ADD #2,R0
MOV R0,(R2)+
MOV @R0,R5 ; R5 = значение регистра (указ. на блок арг.)
BIT #1,R5 ; Адрес блока нечетный ?
BNE 166002$ ; Да
CLR @167502$
CLR @R2
$MFPM$ ; Прочесть аргументы
MOV R0,R2 ; R2 = старшая часть аргумента B
$MFPM$
MOV R0,R3 ; R3 = младшая часть аргумента B
$MFPM$
MOV R0,R4 ; R4 = старшая часть аргумента A
$MFPM$
MOV R0,R5 ; R5 = младшая часть аргумента A
BIC #177747,R1 ; Выделение поля кода операции
ASR R1 ; Переход на нужную п/п
ASR R1
ADD PC,R1
165772$:ADD #166112$-165772$,R1
ADD @R1,R1
JMP @R1
166002$:MOV #4,R5 ; R5 = адрес вектора по ош. обр. к каналу
166006$:$MFPM$ ; Прочесть загр. значение СК
MTPS #200
$MTPC$ ; Установить значение РКСК
$MFPM$ ; Прочесть загр. знач. ССП
$MTPS$ ; Установить значение РКСП
MOV 167502$,R0
ADD #4,R0
MOV (R0)+,R1 ; Восстановить регистры
MOV (R0)+,R2
MOV (R0)+,R3
MOV (R0)+,R4
MOV (R0)+,R5
MOV (R0)+,SP
MOV SP,R5 ; R5 = Указатель вершины стека
MOV 2(R0),R0 ; R0 = сохраненное значение ССП
$MTPM$ ; Занести в стек
MOV 167502$,R0
MOV 20(R0),R0 ; R0 = сохраненное значение СК
$MTPM$ ; Занести в стек
MOV 167502$,R0
MOV R5,SP ; Подкорректировать указатель стека
MOV 14(R0),R5 ; Восстановить R5
MOV 2(R0),R0 ; Восстановить R0
JMP 167500$
; Смещения подпрограмм исполнения действий с ПЗ (FADD, FSUB, FMUL, FDIV)
166112$:.WORD 166624$-166112$,166620$-166112$
.WORD 166122$-166112$,166416$-166112$
; Подпрограмма эмуляции команды FMUL
166122$:BIT #77600,R2 ; Порядок B = 0 ?
BEQ 166406$ ; Да
BIT #77600,R4 ; Порядок A = 0 ?
BEQ 166406$ ; Да
MOV 167502$,R1 ; R1 = адрес буфера сохранения
MOV R2,R0 ; R0 = старшая часть аргумента B
BPL 166152$ ; B >= 0
INC 26(R1) ; Аргумент B отрицательный
166152$:TST R4
BPL 166162$ ; A >= 0
INC 26(R1) ; Аргумент A отрицательный
166162$:MOV R4,R1 ; R1 = старшая часть аргумента A
BIC #100177,R0 ; Выделение порядка B в R0
BIC #100177,R1 ; Выделение порядка A в R0
BIC #177600,R2 ; Выделение старшей части мантиссы B
BIC #177600,R4 ; Выделение старшей части мантиссы A
BIS #200,R2 ; Установка скрытого разряда мантиссы B
BIS #200,R4 ; Установка скрытого разряда мантиссы A
ADD R1,R0 ; R0(порядок B) = порядок_B + порядок_A
SUB #40200,R0 ; Вычитание 129
MOV 167502$,R1 ; R1 = адрес блока сохранения
MOV R0,@R1 ; Сохранить сложенный порядок
MOV R2,30(R1) ; Сохранить в буфере мантиссу B
MOV R3,32(R1)
; /-------------------------------------------------------------------------\
; ! ПРИНЦИП УМНОЖЕНИЯ ДВУХ 32-РАЗРЯДНЫХ ЧИСЕЛ !
; ! !
; ! Два 32-разрядных числа A и B можно представить как : !
; ! !
; ! A = ab, где a - старшая его часть, а b - младшая !
; ! B = cd, где c - старшая его часть, а d - мдадшая !
; ! !
; ! Далее реализуется хорошо известный принцип столбика: !
; ! !
; ! c d !
; ! a b !
; ! ------- !
; ! bd !
; ! bc !
; ! ad !
; ! ac !
; \-------------------------------------------------------------------------/
MOV R2,R0 ; R0 = старшая часть мантиссы B(c)
ASL R2 ; Умножение ст.ч. B на 2 и дел. мл.ч. A на 2
ROR R5 ; для избавления от знакового разр. в A
BCC 166260$ ; Отсутствует остаток от деления на 2
MUL R5,R2 ; (R2,R3) = bc
ADD R0,R3 ; Прибавление остатка
ADC R2
BR 166262$
166260$:MUL R5,R2 ; (R2,R3) = bc
166262$:MOV 167502$,R0 ; R0 = адрес буфера сохранения
MOV 32(R0),R0 ; R0 = младшая часть мантиссы B(d)
ASL R4 ; Избавление от знаковых разрядов в d
ROR R0
BCC 166312$ ; Отсутствует остаток от деления на 2
MUL R4,R0 ; (R0,R1) = ad
ASR R4 ; Приведение a к нормальному виду
ADD R4,R3 ; Прибавление остатка к bc
ADC R2
BR 166316$
166312$:MUL R4,R0 ; (R0,R1) = ad
ASR R4 ; Приведение a к нормальному виду
166316$:ADD R1,R3 ; (R2,R3) = bc + ad
ADC R2
ADD R0,R2
MOV 167502$,R0 ; R0 = адрес буфера сохранения
MOV 30(R0),R0 ; R0 = старшая часть мантиссы B(c)
MUL R4,R0 ; (R1) = ac
ADD R1,R2 ; (R2,R3) = (bc + ad) + ac
MOV 167502$,R0 ; R0 = адрес буфера сохранения
MOV 32(R0),R0 ; R0 = младшая часть мантиссы B(d)
CLC
ROR R0 ; d = d/2 (b уже поделено (R5))
MUL R5,R0 ; (R0,R1) = b/2 * d/2 = bd /4
ASHC #2,R0 ; (R0,R1) = bd/4 * 4 = bd
ADD R0,R3 ; (R2,R3) = ((bc + ad) + ac) + bd)
ADC R2
CLR R1 ; Суть этой команды состоит в сбросе бита C
ROR R2 ; Первый этап нормализации мантиссы
ROR R3 ; (избавление от знакового разряда)
ASHC #72,R2 ; Нормализация мантиссы
ROR R1 ; Сброс бита C
JMP 167140$
; Получение нулевого результата
166406$:CLR R2 ; (R2,R3) = 0.0
CLR R3
JMP 167306$
; Подпрограмма эмуляции команды FDIV
166416$:BIT #77600,R2 ; B = 0 (деление на нуль) ?
BNE 166432$ ; Нет
CLR R5 ; Слово ошибок = 0
166426$:JMP 167330$ ; Деление на нуль
166432$:BIT #77600,R4 ; A = 0 (нуль / ... = нуль) ?
BEQ 166406$ ; Да
MOV 167502$,R1 ; R1 = адрес блока сохранения
MOV R2,R0 ; R0 = старшая часть B
BPL 166454$ ; B >= 0
INC 26(R1) ; Аргумент B отрицательный
166454$:TST R4
BPL 166464$ ; A >= 0
INC 26(R1) ; Аргумент A отрицательный
166464$:MOV R4,R1 ; R1 = старшая часть A
BIC #100177,R0 ; Выделение порядка B в R0
BIC #100177,R1 ; Выделение порядка A в R0
BIC #177600,R2 ; Выделение старшей части мантиссы B
BIC #177600,R4 ; Выделение старшей части мантиссы A
BIS #200,R2 ; Установка скрытого разряда мантиссы B
BIS #200,R4 ; Установка скрытого разряда мантиссы A
SUB R0,R1 ; R1(порядок A) = порядок_A - порядок_B
ADD #37600,R1 ; Прибавить 127
MOV R1,@167502$ ; Сохранить порядок
Код
; /-------------------------------------------------------------------------\
; ! ПРИНЦИП ДЕЛЕНИЯ ДВУХ 32-РАЗРЯДНЫХ ЧИСЕЛ !
; ! !
; ! Деление осуществляется методом "угла" с порязрядным сдвигом !
; ! влево аргумента A и результата. Алгоритм вычисления представлен !
; ! ниже : !
; ! результат := 40 !
; ! нц повторять !
; ! | если A < B !
; ! | | то !
; ! | | | результат := результат * 2 !
; ! | | | A := A * 2 !
; ! | | иначе !
; ! | | | A := A - B !
; ! | | | результат := результат * 2 + 1 !
; ! | | | A := A * 2 !
; ! | все !
; ! кц пока результат[31] = 0 !
; ! результат[31] := 0 !
; \-------------------------------------------------------------------------/
MOV #40,R1 ; Бит признака конца операции
CLR R0
166536$:CMP R4,#200 ; Мантисса A < 0.5
BLT 166566$ ; Да
SUB R3,R5 ; (R4,R5) = (R4,R5) - (R2,R3)
SBC R4
SUB R2,R4
BMI 166560$ ; Мантисса A < B
SEC ; Установить бит C (+ 1 для результата)
BR 166570$
166560$:ADD R3,R5 ; (R4,R5) = (R4,R5) + (R2,R3) (восстановление
ADC R4 ; мантиссы A)
ADD R2,R4
166566$:CLC ; Сбросить бит C (+ 0 для результата)
166570$:ROL R1 ; Результат := результат * 2 + бит_C
ROL R0
ASL R5 ; A := A * 2
ROL R4
TST R0 ; Результат[31] = 0 ?
BPL 166536$ ; Нет
BIC #100000,R0 ; Результат[31] := 0
MOV R0,R2 ; (R2,R3) = (R0,R1)
MOV R1,R3
JMP 167140$
; Подпрограмма эмуляции команды FSUB
166620$:ADD #100000,R2 ; B := (-B)
; Подпрограмма эмуляции команды FADD
166624$:BIT #77600,R2 ; Аргумент B = 0 ?
BNE 166660$ ; Нет
BIT #77600,R4 ; Аргумент A = 0 ?
BNE 166650$
CLR R2 ; Результат := 0
CLR R3
JMP 167306$
166650$:MOV R4,R2 ; Результат := A (B = 0)
MOV R5,R3
166654$:JMP 167306$
166660$:BIT #77600,R4 ; Аргумент A = 0 ?
BEQ 166654$ ; Да (результат := B (A = 0))
MOV R2,R0 ; R0 = старшая часть аргумента B
BIC #177600,R2 ; Выделение старшей части мантиссы B
BIS #200,R2 ; Установка скрытого разряда
TST R0 ; Аргумент B < 0 ?
BPL 166712$ ; Нет
NEG R3 ; Изменить знак мантиссы B
ADC R2
NEG R2
166712$:MOV R4,R1 ; R1 = старшая часть аргумента A
BIC #177600,R4 ; Выделение старшей части мантиссы A
BIS #200,R4 ; Установка скрытого разряда
TST R1 ; Аргумент A < 0 ?
BPL 166736$ ; Нет
NEG R5 ; Изменить знак мантиссы A
ADC R4
NEG R4
166736$:BIC #100177,R0 ; Выделение порядка аргумента B
BIC #100177,R1 ; Выделение порядка аргумента A
MOV R1,@167502$ ; Запомнить порядок аргумента A
SUB R1,R0 ; R0 = порядок_B - порядок_A
BNE 166762$ ; Порядки не равны
CLR R1 ; Последние разряды равны нулю
BR 167074$
166762$:BMI 167034$ ; Порядок A > порядок B
ADD R0,@167502$ ; Сохранить порядок аргумента B (A+B-A=B)
CLR R1 ; Последние разряды равны нулю
CMP R0,#6000 ; Разность порядков больше 24
BLE 167006$ ; Нет
CLR R4 ; Мантисса A равна нулю
CLR R5
BR 167074$
167006$:ASL R0 ; Перенос порядка в младшие разряды
SWAB R0
NEG R0 ; Изменение знака для осущ. сдвига вправо
INCB R0 ; +1 (далее для отлавл. двух выдвин. разр.)
BEQ 167024$
ASHC R0,R4 ; Сдвинуть мантиссу A вправо
ROR R1 ; Запомнить последний разряд
167024$:ASHC #77,R4 ; Сдвинуть мантиссу A на 1 разряд вправо
ROR R1 ; Запомнить предпоследний разряд
BR 167074$
167034$:CLR R1 ; Последние разряды равны нулю
CMP R0,#172000 ; Разность порядков больше -24
BGE 167052$ ; Нет
CLR R2 ; Мантисса B равна нулю
CLR R3
BR 167074$
167052$:ASL R0 ; Перенос порядка в младшие разряды
SWAB R0
INCB R0 ; +1 (для отлавливания 2 выдвинутых разрядов)
BEQ 167066$
ASHC R0,R2 ; Сдвинуть мантиссу B вправо
ROR R1 ; Запомнить последний разряд
167066$:ASHC #77,R2 ; Сдвинуть мантиссу B на 1 разряд вправо
ROR R1 ; Запомнить предпоследний разряд
167074$:ADD R5,R3 ; (R2,R3) = (R2,R3) + (R4,R5)
ADC R2
ADD R4,R2
BPL 167130$ ; Результат > 0
NEG R1 ; Изменить знак мантиссы
ADC R3
ADC R2
NEG R3
ADC R2
NEG R2
MOV 167502$,R0 ; R0 = адрес буфера сохранения
INC 26(R0) ; Результат получился отрицательный
167130$:MOV R3,R4 ; Проверка на нул. мантиссу (отсюда рез. 0)
BIS R1,R4
BIS R2,R4
BEQ 167306$ ; Мантисса нулевая
167140$:CMP R2,#400 ; Мантисса >= 1.0 ?
BLO 167164$ ; Нет
ROR R2 ; Сдвиг мантиссы вправо на 1 разряд
ROR R3
ROR R1
ADD #200,@167502$ ; Порядок := порядок + 1
BR 167140$
167164$:CMP R2,#200 ; Мантисса < 0.5 ?
BHIS 167210$ ; Нет
ASL R1 ; Сдвиг мантиссы влево на 1 разряд
ROL R3
ROL R2
SUB #200,@167502$ ; Порядок := порядок - 1
BR 167164$
167210$:ROL R1 ; Бит C := предпоследний разряд
ADC R3 ; Прибавить предпоследний разряд (округление)
ADC R2
167216$:CMP R2,#400 ; Мантисса >= 1.0
BLO 167242$ ; Нет
ROR R2 ; Сдвиг мантиссы вправо на 1 разряд
ROR R3
ROR R1
ADD #200,@167502$ ; Порядок := порядок + 1
BR 167216$
167242$:CLR R5 ; Регистр признаков = 0
MOV @167502$,R4 ; R4 = порядок
BEQ 167334$ ; Порядок равен нулю (исчезновение порядка)
BPL 167262$ ; Положительный порядок
ROL R4
BPL 167340$ ; Переполнение порядка
BR 167334$ ; Исчезновение порядка
167262$:MOV 167502$,R0 ; R0 = адрес буфера сохранения
ROR 26(R0) ; Результат отрицательный ?
BCC 167300$ ; Нет
BIS #100000,R2 ; Установка знакового разряда
167300$:BIC #200,R2 ; Сброс скрытого бита
BIS R4,R2 ; Установить поле порядка
167306$:CLR R5 ; Регистр признаков = 0
TST R2 ; Установить ССП
BNE 167320$ ; Результат не равен нулю
BIS #4,R5 ; Установить бит Z
167320$:BPL 167350$ ; Результат больше нуля
BIS #10,R5 ; Установить бит N
BR 167350$
167330$:BIS #1,R5 ; R5 = 13 (деление на нуль)
167334$:BIS #10,R5 ; R5 = 12 (исчезновение порядка)
167340$:BIS #2,R5 ; R5 = 2 (переполнение порядка)
BIS #100000,R5 ; Признак регистра ошибок
167350$:MOV 167502$,R0 ; R0 = адрес буфера сохранения
BIC #157,22(R0) ; Сброс битов N,Z,V,C в сохр. ССП
BISB R5,22(R0) ; Установка битов признаков из R5
TST R5 ; Произошла ошибка ?
BPL 167402$ ; Нет
MOV #244,R5 ; R5 = адрес вект. прер. при ош. с числами ПЗ
JMP 166006$
167402$:ADD #4,@24(R0) ; Прибавить 4 к содерж. рег. из кода опер.
MOV @24(R0),R5 ; R5 = адрес памяти для записи результата
ADD #4,R5
MOV 20(R0),R4 ; R4 = сохр. значение СК
MOV 22(R0),R0 ; R0 = сохр. значение ССП
MTPS #200 ; Запретить прерывания
$MTPS$ ; Установить РКСП
MOV R4,R0
$MTPC$ ; Установить РКСК
MOV R3,R0
$MTPM$ ; Запись младшей части результата
MOV R2,R0
$MTPM$ ; Запись старшей части результата
MOV 167502$,R0 ; R0 = адрес буфера сохранения
CMP (R0)+,(R0)+
MOV (R0)+,R1 ; Восстановить регистры
MOV (R0)+,R2
MOV (R0)+,R3
MOV (R0)+,R4
MOV (R0)+,R5
MOV @R0,SP
MOV -14(R0),R0
167500$:$RUN$ ; Продолжить программу
167502$:.WORD 167504$ ; Адрес буфера сохранения
; Буфер сохранения (текущий порядок,R0,R1,R2,R3,R4,R5,SP,PC,PS,указатель на
; поле регистра из инструкции FP,знак результата,2 слова для промежуточного
; хранения мантиссы)
167504$:.BLKW 16
; Подпрограмма исполнения пункта меню ЗАГРУЗКА [тестирование]
167540$:CLR @#177656 ; Номер прохода
CLR @#177654 ; Число ошибок
MOV #177700,R1 ; R1 = адрес буфера регистрации ошибок
MOV #10,R2 ; Размер буфера
167560$:CLR (R1)+ ; Цикл очистки буфера
SOB R2,167560$
JSR R4,163006$ ; Вывод заголовка на экран
.WORD 170116$
167572$:CLV
INC @#177656 ; Увеличить номер прохода
BVC 167610$ ; Нет переполнения
MOV #-1,@#177656 ; Номер прохода равен 65535
167610$:JSR R4,163006$ ; Вывод надписи "ПРОХОД:"
.WORD 170165$
MOV @#177656,R3 ; R3 = номер прохода
CALL 170032$ ; Перевод номера прохода в строку символов
JSR R4,163006$ ; Вывод номера прохода на экран
.WORD 177660
MOV #33,R0 ; Посылка ESC <276> (тест в области ПП)
CALL 172632$
MOV #276,R0
CALL 172632$
CALL 170632$ ; Тестирование процессора (ЦП)
TST R0 ; Есть ошибки ?
BEQ 167704$ ; Нет
MOV #16,R0 ; R0 = смещение в буфере регистрации ошибок
CMP #-1,177700(R0) ; Число ошибок достигло максимума ?
BEQ 167704$ ; Да
INC 177700(R0) ; Увеличить счетчик числа ошибок
167704$:CLR R4 ; R4 = 0 (начальный адрес памяти ЦП)
MOV #160000,R5 ; R5 = размер ОЗУ ЦП
CALL 170224$ ; Тестирование памяти
TST R0 ; Есть ошибки ?
BEQ 167742$ ; Нет
MOV #14,R0 ; R0 = смещение в буфере регистрации ошибок
CMP #-1,177700(R0) ; Число ошибок достигло максимума ?
BEQ 167742$ ; Да
INC 177700(R0) ; Увеличить счетчик числа ошибок
167742$:CALL 172614$ ; Ожид. симв. с кодом 177(8)(ПП кончил тест)
CLR @#177654 ; Общее число ошибок = 0
MOV #177700,R1 ; R1 = адрес буфера регистрации ошибок
MOV #10,R2 ; R2 = размер буфера
CLV
167764$:ADD (R1)+,@#177654 ; Цикл получения общей суммы
BVC 170002$ ; Нет переполнения
MOV #-1,@#177654 ; Общее число ошибок = 65535
BR 170004$
170002$:SOB R2,167764$
170004$:JSR R4,163006$ ; Вывод надписи "ОШИБОК:"
.WORD 170204$
MOV @#177654,R3 ; R3 = число ошибок
CALL 170032$ ; Перевод числа ошибок в строку символов
JSR R4,163006$ ; Вывод числа ошибок на экран
.WORD 177660
BR 167572$
; Подпрограмма перевода 16-разрядного числа в его ASCII-представление
170032$:MOV #177660,R0 ; R0 = адрес буфера приема символов
MOV #6,R2 ; R2 = размер буфера
170042$:MOVB #40,(R0)+ ; Инициализация буфера (заполнение пробелами)
SOB R2,170042$
CLRB @R0 ; Отметить конец буфера
170052$:CLR -(SP) ; Остаток от деления равен 0 (инициализация)
MOV #16.,R1 ; R1 = число разрядов
170060$:ASL R3 ; Цикл дел. на 10, частное в R3, остаток в @SP
ROL @SP
CMP @SP,#10.
BMI 170100$
SUB #10.,@SP
INC R3
170100$:SOB R1,170060$
ADD #'0,@SP ; Преобразование из BIN в ASCII
MOVB (SP)+,-(R0) ; Занести символ в буфер
TST R3 ; Деление окончено ?
BNE 170052$ ; Нет
RETURN
170116$:.BYTE 33,'H,33,'J,33,'Y,'%,':,33,244
.ASCII <16>/t e s t i r o w a n i e/
.BYTE 33,277,244,17,0
170165$:.ASCIZ <33>/Y(5/<16>/prohod: /<17>
170204$:.ASCIZ <16>/ o{ibok: /<17>
.EVEN
; Подпрограмма тестирования оперативного запоминающего устройства
170224$:MOV R4,R1 ; R1 = начальный адрес ОЗУ
CLR R3
170230$:MOV R1,R0 ; R0 = текущий адрес
TST R3 ; Прямой адрес(0), инверсный адрес(<>0)
BEQ 170240$
COM R0
170240$:MOV R0,(R1)+ ; Записать в ячейку ее адрес(прям. или инв.)
CMP R1,R5 ; Достигли конца ?
BLO 170230$ ; Нет
170246$:CMP R0,-(R1) ; Содержимое ячейки равно ее адресу
BEQ 170260$ ; Да
MOV #1,R0 ; Ошибка
RETURN
170260$:MOV R1,R0 ; R0 = текущий адрес
SUB #2,R0 ; На одну ячейку назад
TST R3 ; Прямой или инверсный адрес ?
BEQ 170274$ ; Прямой
COM R0
170274$:CMP R1,R4 ; Достигли начала ?
BHI 170246$ ; Нет
COM R3 ; Перейти на инверсный адрес
BNE 170230$ ; Произвести тест с инверсным адресом
MOV #377,-12(SP) ; Будет заполняться младший байт
MOV R4,R3 ; R3 = начальный адрес
170314$:CLR -6(SP)
MOV R3,-10(SP) ; Начальный адрес
MOV R3,R2
BIS #17776,R2
TST (R2)+ ; Плюс 8 КБайт
CMP R5,R2 ; Достигли конца ?
BHIS 170342$ ; Нет
MOV R5,R2 ; R2 = конечный адрес
170342$:MOV R3,-14(SP) ; Текущий адрес
MOV -10(SP),R1 ; R1 = начальный адрес
170352$:MOV -12(SP),R0 ; R0 = образец заполнения
CMP R1,R3
BNE 170370$
ADD #200,R3 ; Плюс 128 байт (128 байт 1..10..0,0..01..1)
SWAB R0 ; Изменить байты образца
170370$:BITB #1,-6(SP) ; Делать запись
BNE 170402$ ; Нет
MOV R0,@R1 ; Записать в ячейку
170402$:CMP R0,@R1 ; Совпадает ?
BEQ 170414$ ; Да
MOV #3,R0 ; Ошибка
RETURN
170414$:ADD #2,R1 ; Перейти к следующей ячейке
CMP R1,R2 ; Достигнут конец 8-КБайтной страницы ?
BLO 170352$ ; Нет
INCB -6(SP) ; Переключить режим записи/проверки
MOV -14(SP),R3 ; R3 = текущий адрес
BITB #1,-6(SP) ; Какой режим ?
BNE 170342$ ; Проверка
TST (R3)+ ; Текущий адрес + 2
CMP R3,R2 ; Конец страницы ?
BHIS 170460$ ; Да
TSTB -6(SP) ; Сделано 128 проходов ?
BPL 170342$ ; Нет
170460$:MOV -10(SP),R3 ; R3 = текущий адрес
SWAB -12(SP) ; Обменять байты образца
BEQ 170342$ ; Младший байт = 0 (для второго прохода)
MOV R2,R3 ; Текущий адрес = начало след. 8-КБайтной стр.
CMP R2,R5 ; Достигнут конец ?
BLO 170314$ ; Нет
MOV #377,-12(SP) ; Образец заполнения
170506$:MOV R4,R1 ; R1 = начальный адрес
MOV -12(SP),R0 ; R0 = образец заполнения
170514$:MOV R0,(R1)+ ; Записать в ячейку
CMP R1,R5 ; Достигнут конец ?
BLO 170514$ ; Нет
MOV R4,R1 ; R1 = начальный адрес
170524$:CMP R0,@R1 ; Сравнить содержимое ячейки с образцом
BEQ 170536$ ; Равно
MOV #2,R0 ; Ошибка
RETURN
170536$:ADD #2,R1 ; Перейти к следующей ячейке
CMP R1,R5 ; Достигнут конец ?
BLO 170524$ ; Нет
CALL 170614$ ; Задержка
MOV -12(SP),R0 ; R0 = образец заполнения
MOV R4,R1 ; R1 = начальный адрес
170560$:CMP R0,@R1 ; Сравнить содержимое ячейки с образцом
BEQ 170572$ ; Равно
MOV #3,R0 ; Ошибка
RETURN
170572$:ADD #2,R1 ; Перейти к следующей ячейке
CMP R1,R5 ; Достигнут конец ?
BLO 170560$ ; Нет
SWAB -12(SP) ; Обменять байты образца
BEQ 170506$ ; На второй проход
CLR R0 ; Нет ошибок
RETURN
; Подпрограмма реализации задержки
170614$:MOV #1000.,R2
170620$:MOV #1000.,R3
170624$:SOB R3,170624$
SOB R2,170620$
RETURN
; Подпрограмма тестирования процессора
170632$:CCC ; Сбросить все биты признаков
BCS 170654$ ; C=1
BVS 170654$ ; V=1
BEQ 170654$ ; Z=1
BMI 170654$ ; N=1
BLT 170654$ ; N<>V
BLE 170654$ ; (N<>V) or Z=1
BLOS 170654$ ; Z=1 or C=1
BHI 170660$ ; Z=0 and C=0
170654$:JMP 172604$ ; Ошибка
170660$:SEV ; Установить V и N
SEN
BVC 170674$ ; V=0
BLT 170674$ ; N<>V
BLE 170674$ ; (N<>V) or Z=1
BGE 170700$ ; N=V
170674$:JMP 172604$ ; Ошибка
170700$:SEZ ; Установить Z и C
SEC
BNE 170714$ ; Z=0
BGT 170714$ ; Z=0 and (N=V)
BHI 170714$ ; Z=0 and C=0
BLE 170720$ ; (N<>V) or Z=1
170714$:JMP 172604$ ; Ошибка
170720$:MOV SP,R3
TST -(R3) ; R3 = R3 - 2
CLR @R3
MOV R3,R0
TST -(R3) ; R3 = R3 - 2
MOV R0,@R3 ; (R3) = адрес ячейки с нулевым содерж.
MOV R3,R4
CCC ; Очистить все биты признаков
TST @(R3)+ ; В ячейке нуль ?
BEQ 170750$ ; Да
JMP 172604$ ; Ошибка
170750$:SEC ; Установка бита C
ROR @-(R3) ; Уст. ст. разр. в 1,выдв. млад. =0 (10...0))
BCS 170762$ ; C=1
BVC 170762$ ; V=0
BMI 170766$ ; N=1
170762$:JMP 172604$ ; Ошибка
170766$:CCC ; Очистить все биты признаков
ASR @(R4)+ ; Оставить старший бит (110...0)
BVC 170776$ ; V=0
BMI 171002$ ; N=1
170776$:JMP 172604$ ; Ошибка
171002$:CLN ; Очистить бит N
ASL @(R3)+ ; Сдвиг влево (10...0)
BCC 171014$ ; C=0
BVS 171014$ ; V=1
BMI 171020$ ; N=1
171014$:JMP 172604$ ; Ошибка
171020$:SCC ; Установить все биты признаков
DEC @-(R4) ; Минус 1 (01...1)
BHIS 171034$ ; C=0
BVC 171034$ ; V=0
BEQ 171034$ ; Z=1
BPL 171040$ ; N=0
171034$:JMP 172604$ ; Ошибка
171040$:NEG @-(R3) ; Смена знака (10...01)
BCC 171050$ ; C=0
BVS 171050$ ; V=1
BMI 171054$ ; N=1
171050$:JMP 172604$ ; Ошибка
171054$:SEV ; Установка бита V
COM @(R4)+ ; Инверсия (01...10)
BCC 171064$ ; C=0
BVC 171070$ ; V=0
171064$:JMP 172604$ ; Ошибка
171070$:INC @(R3)+ ; Плюс 1 (01...1)
BHIS 171076$ ; C=0
BPL 171102$ ; N=0
171076$:JMP 172604$ ; Ошибка
171102$:ADC @-(R4) ; Прибавление переноса (10...0)
BCS 171112$ ; C=1
BVC 171112$ ; V=0
BMI 171116$ ; N=1
171112$:JMP 172604$ ; Ошибка
171116$:CCC ; Очистить все биты признаков
ROL @(R4)+ ; Сдвиг влево (0...0)
BCC 171130$ ; C=0
BVC 171130$ ; V=0
BEQ 171134$ ; Z=1
171130$:JMP 172604$ ; Ошибка
171134$:INC @-(R3) ; Плюс 1 (0...01)
SBC @-(R4) ; Вычитание переноса (0...0)
BCS 171144$ ; C=1
BEQ 171150$ ; Z=1
171144$:JMP 172604$ ; Ошибка
171150$:MOV SP,R2
TST -(R2) ; R2 = R2 - 2
MOV R2,R0
CLR @R0 ; Очистка (0...0)
TST -(R2) ; R2 = R2 - 4
TST -(R2)
MOV R0,(R2)+ ; SP-2
INC R0
MOV R0,(R2)+ ; SP-1
MOV R2,R0 ; SP-2
MOV R2,R1 ; SP-2
COMB @-(R2) ; Инверсия (High 1...1)
BCC 171204$ ; C=0
BMI 171210$ ; N=1
171204$:JMP 172604$ ; Ошибка
171210$:TSTB @-(R2) ; Проверка (Low 0...0)
BEQ 171220$ ; Z=1
JMP 172604$ ; Ошибка
171220$:SEV ; Установка бита V
ASRB @-(R1) ; Сдвиг вправо (High 1...1)
BCC 171232$ ; C=0
BVS 171232$ ; V=1
BMI 171236$ ; N=1
171232$:JMP 172604$ ; Ошибка
171236$:INCB @(R2)+ ; Плюс 1 (Low 0...01)
BCC 171244$ ; C=0
BPL 171250$ ; N=0
171244$:JMP 172604$ ; Ошибка
171250$:CLC ; Сбросить бит C
RORB @-(R1) ; Сдвиг вправо (Low 0...0)
BCC 171264$ ; C=0
BVC 171264$ ; V=0
BNE 171264$ ; Z=0
BPL 171270$ ; N=0
171264$:JMP 172604$ ; Ошибка
171270$:ASLB @(R2)+ ; Сдвиг влево (High 1...10)
BCC 171300$ ; C=0
BVS 171300$ ; V=1
BMI 171304$ ; N=1
171300$:JMP 172604$ ; Ошибка
171304$:ADCB @-(R2) ; Прибавление переноса (High 1...1)
BCS 171312$ ; C=1
BMI 171316$ ; N=1
171312$:JMP 172604$ ; Ошибка
171316$:SCC ; Установка всех битов признаков
ROLB @(R1)+ ; Сдвиг влево (Low 0...01)
BLOS 171330$ ; C=1 or Z=1
BVS 171330$ ; V=1
BPL 171334$ ; N=0
171330$:JMP 172604$ ; Ошибка
171334$:SWAB @-(R2) ; Обменять байты (High 0...01 Low 1...1)
BMI 171344$ ; N=1
JMP 172604$ ; Ошибка
171344$:SEC ; Установка бита C
SBCB @(R1)+ ; Вычитание переноса (High 0...0)
BCS 171354$ ; C=1
BEQ 171360$ ; Z=1
171354$:JMP 172604$ ; Ошибка
171360$:NEGB @(R2)+ ; Смена знака (Low 0...01)
DECB @-(R2) ; Минус 1 (Low 0...0)
BCC 171370$ ; C=0
BEQ 171374$ ; Z=1
171370$:JMP 172604$ ; Ошибка
171374$:MOV SP,R0 ; R0 = SP
TST -(R0) ; R0 = R0 - 2
MOV R0,R1 ; SP-2
CMP -(R1),-(R1) ; SP-6
MOV R0,@R1 ; -6(SP) = ADDR(-2(SP))
MOV R1,R2 ; SP-6
MOV R0,R4 ; SP-2
TST -(R0) ; SP-4
MOV R0,R3 ; SP-4
MOV R0,-(R2) ; R2 = SP-8 -8(SP) = ADDR(-4(SP))
CLR @R3 ; -4(SP) = 0
CLR @R4 ; -2(SP) = 0
SCC ; Установка битов N,V,C
CLZ
SUB @(R2)+,@(R1)+ ; -2(SP)=-2(SP) - -4(SP)=0
BLO 171440$ ; C=1
BVS 171440$ ; V=1
BEQ 171444$ ; Z=1
171440$:JMP 172604$ ; Ошибка
171444$:BIS #100000,@-(R2) ; -4(SP) = 100000
ADD #1,@-(R1) ; -2(SP) = 1
SUB @(R2)+,@(R1)+ ; -2(SP) = 1 - 100000 = 100001
BHIS 171464$ ; C=0
BVC 171464$ ; V=0
BMI 171470$ ; N=1
171464$:JMP 172604$ ; Ошибка
171470$:NEG @R4 ; -2(SP) = 077777
BIT @-(R2),@-(R1) ; 100000 and 077777 = 0
BEQ 171502$ ; Z=1
JMP 172604$ ; Ошибка
171502$:CMP @(R2)+,@(R1)+ ; 100000 - 077777 = 1 (C=1,V=1,N=0,Z=0)
BVS 171512$ ; V=1
JMP 172604$ ; Ошибка
171512$:COM @-(R2) ; Инверсия -4(SP) = 077777
CCC ; Очистить все биты признаков
ADD @(R2)+,@-(R1) ; -2(SP) = 077777 + 077777 = 177776
BVC 171524$ ; C=0
BMI 171530$ ; N=1
171524$:JMP 172604$ ; Ошибка
171530$:SEC ; Установка бита C
BIC @-(R2),@(R1)+ ; -2(SP) = 177776 and not 77777 = 100000
BCC 171540$ ; C=0
BMI 171544$ ; N=1
171540$:JMP 172604$ ; Ошибка
171544$:COM @-(R1) ; Инверсия -2(SP) = 77777
CMP @(R2)+,@(R1)+ ; 077777 - 077777 = 0 (C=0,V=0,N=0,Z=1)
BEQ 171556$ ; Z=1
JMP 172604$ ; Ошибка
171556$:MOV SP,R0 ; R0 = SP
TST -(R0) ; SP-2
MOV R0,R3 ; SP-2
MOV R3,R1 ; SP-2
TST -(R3) ; SP-4
MOV R0,-(R3) ; -6(SP) = ADDRB(-1(SP))
INC @R3
MOV R0,-(R3) ; -8(SP) = ADDRB(-2(SP))
MOV R3,R4 ; SP-8
TST -(R0) ; SP-4
MOV R0,-(R4) ; -10(SP) = ADDRB(-3(SP))
INC @R4
MOV R0,-(R4) ; -12(SP) = ADDRB(-4(SP))
SEC ; Установить бит C
MOV #177001,@(R4)+ ; -4(SP) = 1 -3(SP) = 376
MOVB #200,@(R4)+ ; -3(SP) = 200
MOVB @-(R4),@(R3)+ ; -2(SP) = 200
MOVB @-(R4),@(R3)+ ; -1(SP) = 1
BCS 171634$ ; C=1
JMP 172604$ ; Ошибка
171634$:CMP #600,@R1 ; 600 - 600 = 0 (C=0,V=0,N=0,Z=1)
BEQ 171646$ ; Z=1
JMP 172604$ ; Ошибка
171646$:CMP -(R3),-(R3) ; SP-8
BISB @(R4)+,@(R3)+ ; -2(SP) = 200 or 1 = 201
BISB @(R4)+,@(R3)+ ; -1(SP) = 1 or 200 = 201
CMP #100601,@R1 ; 100601 - 100601 = 0 (C=0,V=0,N=0,Z=1)
BEQ 171666$ ; Z=1
JMP 172604$ ; Ошибка
171666$:BICB @-(R4),@-(R3) ; -1(SP) = 201 and not 200 = 1
BICB @-(R4),@-(R3) ; -2(SP) = 201 and not 1 = 200
BITB @(R4)+,@(R3)+ ; 1 and 200 = 0
BNE 171702$ ; Z=0
BITB @-(R4),@(R3)+ ; 1 and 1 = 1
BNE 171706$ ; Z=1
171702$:JMP 172604$ ; Ошибка
171706$:CMPB @(R4)+,@-(R3) ; 1 - 1 = 0 (C=0,V=0,N=0,Z=1)
BNE 171716$ ; Z=0
CMPB @(R4)+,@-(R3) ; 1 - 200 = 201 (C=1,V=1,N=1,Z=0)
BEQ 171722$ ; Z=1
171716$:JMP 172604$ ; Ошибка
171722$:MOV PC,R0 ; R0 = 171724
ADD #171736$-.,R0 ; R0 = 171736
SCC ; Установить все биты признаков
JMP @R0 ; PC = 171736
171734$:BR 171742$
171736$:CLN ; Сбросить бит N
BR 171734$
171742$:BCC 171752$ ; C=0
BVC 171752$ ; V=0
BNE 171752$ ; Z=0
BPL 171756$ ; N=0
171752$:JMP 172604$ ; Ошибка
171756$:CLR R2
MOV PC,R4 ; R4 = 171762
MOV R4,R0 ; R0 = 171762
BR 171772$
171766$:COM R2 ; R2 = 177777
BR 172000$
171772$:CMP (R4)+,(R4)+ ; R4 = 171766
TST (R4)+ ; R4 = 171770
JMP -(R4) ; PC = 171766 R4 = 171766
172000$:INC R2 ; R2 = 0
BNE 172012$ ; Z=0
CMP (R0)+,(R0)+ ; R0 = 171766
CMP R0,R4 ; 171766 - 171766 = 0 (C=0,V=0,N=0,Z=1)
BEQ 172016$ ; Z=1
172012$:JMP 172604$ ; Ошибка
172016$:MOV PC,R2 ; R2 = 172020
ADD #172044$-.,R2 ; R2 = 172044
SCC ; Установить биты N,C,Z
CLV
JSR R1,@R2 ; PC = 172044
TST R2
BEQ 172066$ ; Z=1
JMP 172604$
172042$:RTS R1
172044$:BCC 172060$ ; C=0
BVS 172060$ ; V=1
BNE 172060$ ; Z=0
BPL 172060$ ; N=0
CLR R2
BR 172042$
172060$:TST (SP)+
JMP 172604$ ; Ошибка
172066$:MOV SP,R4
TST -(R4) ; SP-2
CLR R3
MOV #5,R2
MOV #2,@R4
SCC ; Установить все признаки
MUL @R4,R2 ; (R2,R3) = 5 * 2 = 12 (R2 = 0) (R3 = 12)
BMI 172116$ ; N=1
BLOS 172116$ ; Z=1 or C=1
BVC 172122$ ; V=0
172116$:JMP 172604$ ; Ошибка
172122$:CMP #12,R3 ; R3=12 ?
BEQ 172134$ ; Да
JMP 172604$ ; Ошибка
172134$:TST R2 ; R2=0 ?
BEQ 172144$
JMP 172604$ ; Ошибка
172144$:CLR R3
MOV #125252,R2
MOV #2,@R4
MUL @R4,R2 ; (R2,R3)=125252*2=37777652524(R2=-1)(R3=52524)
BCC 172170$ ; C=0
BPL 172170$ ; N=0
BVS 172170$ ; V=1
BNE 172174$ ; Z=0
172170$:JMP 172604$ ; Ошибка
172174$:CMP #-1,R2 ; R2=-1 ?
BEQ 172206$ ; Да
JMP 172604$ ; Ошибка
172206$:CMP #52524,R3 ; R3=52524 ?
BEQ 172220$ ; Да
JMP 172604$ ; Ошибка
172220$:MOV #1,@R4
MOV #125252,R2
CCC ; Установить биты Z,N
SEZ
SEN
ASH @R4,R2 ; R2 = 125252 << 1 = 52524
BMI 172250$ ; N=1
BEQ 172250$ ; Z=1
BVC 172250$ ; V=0
BCS 172254$ ; C=1
172250$:JMP 172604$ ; Ошибка
172254$:CMP #52524,R2 ; R2 = 52524 ?
BEQ 172266$ ; Да
JMP 172604$ ; Ошибка
172266$:MOV #-1,@R4
MOV #52525,R1
ASH @R4,R1 ; R1 = 52525 >> 1 = 25252
CMP R1,#25252 ; R1 = 25252 ?
BEQ 172312$ ; Да
JMP 172604$ ; Ошибка
172312$:CLR R2
MOV #20,@R4
MOV #125252,R3
CCC ; Установка битов Z,C
SEZ
SEC
ASHC @R4,R2 ; (R2,R3)=125252<<20=25252400000
BPL 172344$ ; N=0
BEQ 172344$ ; Z=1
BVC 172344$ ; V=0
BCC 172350$ ; C=0
172344$:JMP 172604$ ; Ошибка
172350$:CMP #125252,R2 ; R2 = 125252 ?
BEQ 172362$ ; Да
JMP 172604$ ; Ошибка
172362$:TST R3 ; R3 = 0 ?
BEQ 172372$ ; Да
JMP 172604$ ; Ошибка
172372$:CLR R3
MOV #-20,@R4
MOV #125252,R2
CLN ; Установка Z,V,C
SEZ
SEV
SEC
ASHC @R4,R2 ; (R2,R3)=25252400000>>20=37777725252
BPL 172424$ ; N=0
BLOS 172424$ ; Z=1 or C=1
BVC 172430$ ; C=0
172424$:JMP 172604$ ; Ошибка
172430$:CMP #-1,R2 ; R2=-1 ?
BEQ 172442$ ; Да
JMP 172604$ ; Ошибка
172442$:CMP #125252,R3 ; R3=125252 ?
BEQ 172454$ ; Да
JMP 172604$ ; Ошибка
172454$:MOV #52525,@R4
CLR R2
MOV #52525,R3
SCC ; Установить все биты признаков
DIV @R4,R2 ; (R2,R3) = 52525 / 52525 = (1,0)
BMI 172500$ ; N=1
BLOS 172500$ ; Z=1 or C=1
BVC 172504$ ; V=0
172500$:JMP 172604$ ; Ошибка
172504$:CMP R2,#1 ; R2 = 1 ?
BEQ 172516$ ; Да
JMP 172604$ ; Ошибка
172516$:TST R3 ; R3 = 0 ?
BEQ 172526$ ; Да
JMP 172604$ ; Ошибка
172526$:MOV #157777,R2
MOV #100001,R3
MOV #100000,@R4
SCC ; Установить все биты признаков
DIV @R4,R2 ; (R2,R3)=33777700001/100000=(40000,100001)
BMI 172554$ ; N=1
BLOS 172554$ ; Z=1 or C=1
BVC 172560$ ; V=0
172554$:JMP 172604$ ; Ошибка
172560$:CMP R2,#40000 ; R2 = 40000 ?
BEQ 172572$ ; Да
JMP 172604$ ; Ошибка
172572$:CMP R3,#100001 ; R3 = 100001 ?
BNE 172604$ ; Z=0 (ошибка)
CLR R0 ; Ошибок нет
RETURN
172604$:MOV #1,R0 ; Есть ошибки
RETURN
172612$:.WORD 414 ; Конец стека пультового отладчика
; Подпрограмма ввода символа с ожиданием (для ПП)
172614$:EMT 22 ; Ввод символа
RETURN
.WORD 0,0,0,0,0
; Подпрограмма вывода символа на экран (для ПП)
172632$:EMT 42 ; Вывод символа
RETURN
.WORD 0,0,0,0,0,0,0,0,0
; Указатели на ОЗУ пультового отладчика,адрес выводимой надписи,адрес открытой
; ячейки,разрешение/запрет вывода надписей. Начальное значение PS и SP.
; Объем ОЗУ в словах. Эти данные для ПП.
172660$:.WORD 450
172662$:.WORD 500
172664$:.WORD 472
172666$:.WORD 504
172670$:.WORD 0
172672$:.WORD 100000
172674$:.WORD 40000
; Начальная инициализация и вывод ошибок стартового теста
172676$:MOV #2000,SP
ASLB R0
ASLB R0
MOV R0,-(SP)
CALL 173502$ ; Полн. иниц. (уст.вект.прер. и иниц. устр.)
MOV (SP)+,R2 ; R2 = слово ошибок
MOV @#177060,R0 ; R0 = данные К0 (терминал)(слово ошибок ЦП)
CMP R0,#2
BHI 172742$
BIS R0,R2 ; Объединить ошибки ПП и ЦП
BEQ 172746$ ; Нет ошибок
CALL 172764$ ; Вывод ошибок на экран
BR 172746$
172742$:CALL 117136$ ; Поместить символ в буфер терминала
172746$:MOV #2,@#7042 ; Передача кодов клавиатуры по каналу 0
MTPS #0 ; Разрешить прерывания
JMP 174152$
; Подпрограмма вывода результатов стартового теста
172764$:JSR R5,117204$ ; Вывод заголовка
.WORD 173060$
MOV #173036$,R3 ; Адрес массива адресов надписей об ошибках
BR 173004$
173000$:JSR R5,117206$ ; Вывод сообщения об ошибке на экран
173004$:MOV (R3)+,R1 ; R1 = адрес сообщения об ошибке
ASRB R2
BCS 173000$ ; Есть ошибка
BNE 173004$ ; Еще есть ошибки
MOV #173046$,R3 ; Адрес массива адресов об ошибках ПЗУ
MOV (R3)+,R1 ; R1 = адрес сообщения об ошибке
SWAB R2
BNE 173000$ ; Ошибки есть
JSR R5,117204$ ; Вывод ESC <270> (пауза)
.WORD 173246$
RETURN
; Массив адресов сообщений об ошибках
173036$:.WORD 173113$,173131$,173153$,173171$
; Массив адресов сообщений об ошибках ПЗУ
173046$:.WORD 173213$,173232$,173235$,173240$,173243$
173060$:.BYTE 15,12,40,40,33,244
.ASCII /СТАРТОВЫЙ ТЕСТ/
.BYTE 33,277,244,15,12,12,0
173113$:.ASCIZ /- ошибка ЦП/<15><12>
173131$:.ASCIZ /- ошибка ОЗУ ЦП/<15><12>
173153$:.ASCIZ /- ошибка ПП/<15><12>
173171$:.ASCIZ /- ошибка ОЗУ ПП/<15><12>
173213$:.ASCIZ /- ошибка ПЗУ /
173232$:.ASCIZ /1 /
173235$:.ASCIZ /2 /
173240$:.ASCIZ /3 /
173243$:.ASCIZ /4 /
173246$:.BYTE 33,270,0
.EVEN
; Подпрограмма перекачки пультового отладчика в системное ОЗУ ЦП
173252$:MOV #<160000/2>&77777,@#177010; Адрес начала системного ОЗУ ЦП
MOV #160000,R1 ; Адрес начала пультового отладчика
MOV #5305,R0 ; Размер перек. данных (160000 - 172611)
173270$:MOV (R1)+,@#177014 ; Цикл перекачки
INC @#177010
SOB R0,173270$
MOV #173356$,R1 ; Адрес подпрограмм для ЦП
MOV #44,R0 ; Размер (173356 - 173465)
173312$:MOV (R1)+,@#177014 ; Цикл перекачки в 172612 - 172721
INC @#177010
SOB R0,173312$
MOV @#177716,@#177014; (172722) = системный регистр управления
MOV #173466$,R1 ; Адр. мас. для уст. знач. ССП в вект.прер.
173336$:MOV (R1)+,@#177010 ; Цикл установки
MOV #600,@#177014
TST @R1 ; Конец массива ?
BNE 173336$ ; Нет
RETURN
173356$:.WORD 160014$ ; Конец стека пультового отладчика (для ЦП)
; Ее адрес в СОЗУ ЦП - 172612.
; Подпрограмма ввода символа с ожиданием (для ЦП). Адрес в СОЗУ ЦП - 172614.
173360$:MOV #177560,R5 ; R5 = адрес регистра сост. К0 (клавиатура)
$MFPM$ ; Чтение регистра состояния
TSTB R0 ; Есть символ для чтения ?
BPL 173360$ ; Нет
$MFPM$ ; Чтение символа
RETURN
; Подпрограмма вывода символа на экран (для ЦП). Адрес в СОЗУ ЦП - 172632.
173376$:MOV R0,-(SP) ; Сохранить код символа в стеке
173400$:MOV #177564,R5 ; R5 = адрес регистра сост. К0 (терминал)
$MFPM$ ; Чтение регистра состояния
TSTB R0 ; Можно посылать данные ?
BPL 173400$ ; Нет
MOV (SP)+,R0 ; R0 = код символа
MOV #177566+2,R5 ; R5 = адрес рег. данных (терминал) + 2
$MTPM$ ; Посылка кода символа по К0
RETURN
; Указатели на ОЗУ пультового отладчика,адрес выводимой надписи,адрес открытой
; ячейки,разрешение/запрет вывода надписей. Начальное значение PS и SP.
; Объем ОЗУ в словах. Эти данные для ЦП. Их адрес в СОЗУ ЦП - 172660.
173424$:.WORD 160050,160100,160072,160104,200,1000,70000
; Подпрограмма выбора режима работы (ЦП). Ее адрес в сист.ОЗУ ЦП - 172676.
173442$:CALL 173376$ ; Посылка по каналу 0 результатов теста
173446$:TST @#163772 ; Ожидание ответа от ПП
BEQ 173446$
BPL 173462$ ; Обнаружен контроллер НГМД
JMP @#162440$ ; На загрузку из сети
173462$:JMP @#160744 ; На вывод меню ЗАГРУЗКА
; Адреса знач. ССП в векторах прер. ЦП (в формате загрузки в рег.адреса)
173466$:.WORD 70001,70003,70075,70077,70137,0
; Подпрограмма проведения инициализации
173502$:CALL 107754$ ; Программная инициализация драйвера терминала
MOV #RETURN,@#0 ; Установка векторов внутренних прерываний
MOV #600,R0
MOV #160200$,@#4
MOV R0,@#6
MOV #160210$,@#10
MOV R0,@#12
MOV #160220$,@#24
MOV R0,@#26
CALL 103564$ ; Программная инициализация драйв. клавиатуры
CALL 126136$ ; Программная иниц. драйвера магнитофона
CALL 135456$ ; Программная иниц. драйвера граф. дисплея
CALL 136004$ ; Программная иниц. драйвера принтера
CALL 100000$ ; Начальные данные для меню УСТАНОВКА
CALL 173744$ ; Уст.вект.прер.периферийных устройств
MOV SP,@#7040 ; Сохранить SP
MOV #173632$,@#4 ; Уст.вект.ошибки обращ. к каналу
CALL 130712$ ; Программная иниц. драйвера дисковода
MOV #1,R0 ; Обнаружен контроллер НГМД
BR 173642$
173632$:MOV @#7040,SP ; Восстановить SP
MOV #-1,R0 ; Контроллер НГМД не обнаружен
173642$:MOV #<163772$/2>&77777,@#177010; Адрес ключа о присут. НГМД
MOV R0,@#177014 ; Передать ключ
MOV R0,@#7044
BIC #1400,@#177054 ; Включить сетевой таймер в ЦП и ПП
BIS #100,@#177066 ; Разрешение прерывания по RESET ЦП
CLR @#177712 ; Очистить буферный регистр таймера
MOV #1,@#177710 ; Пуск программируемого таймера
173706$:MOV #23660,R0 ; R0 = адрес начала ОЗУ ПП пользователя
CLR (R0)+ ; Блок свободен
CLR (R0)+ ; Ссылка на предыдущий блок
MOV #54104,@R0 ; Размер свободного блока
ADD (R0)+,R0 ; Переход к фиктивной области
INC @R0 ; Признак занятой области
RETURN
; Подпрограмма очистки блока памяти
173730$:CLR R0 ; Заполняемое значение (0)
MOV (R5)+,R1 ; Адрес начала
MOV (R5)+,R2 ; Размер в словах
173736$:MOV R0,(R1)+ ; Цикл очистки
SOB R2,173736$
RTS R5
; Подпрограмма установки векторов прерываний периферийных устройств
173744$:MOV #174270$,@#30 ; Вектор прерывания команды EMT
CLR @#32
MOV #174334$,@#34 ; Вектор прерывания команды TRAP
MOV #200,@#36
MOV #174612$,@#100 ; Вектор прерывания сетевого таймера
MOV #200,@#102
MOV #175754$,@#330 ; Вектор прерывания К1 (приемник)
BIS #2,@#177066 ; Разрешить прерывания по К1 (приемник)
MOV #175762$,@#340 ; Вектор прерывания К2 (приемник)
MOV #200,@#342
BIS #4,@#177066 ; Разрешить прерывания по К2 (приемник)
CLR @#23202 ; Счетчик принятых байтов по К2
MOV #100/2,@#177010; Установить вектор прерывания сетевого
MOV #104,@#177014 ; таймера канала ЦП
INC @#177010
MOV #200,@#177014
INC @#177010
MOV #RTI,@#177014
MOV #7777,@#7052
CALL 176422$ ; Инициализация программируемого таймера
MOV #176130$,@#314 ; Вект. прер. по команде RESET в канале ЦП
MOV #200,@#316
INC @#7102 ; Индикатор вызова фиктивной подпрограммы
MOV #174222$,@#7126; Адрес фиктивной подпрограммы
RETURN
; *** ОСНОВНОЙ ЦИКЛ ДИСПЕТЧЕРА ПРОЦЕССОВ ***
174152$:MOV #2000,SP
MOV #2,@#7042 ; Передача кодов клавиатуры К0
174164$:MOV #7060,R0 ; R0 = буфер флагов вызова
174170$:TST (R0)+ ; Запрошен вызов
BEQ 174170$ ; Нет
MOV R0,@#7056 ; Сохранить адрес флага вызова + 2
MOV 22(R0),R1 ; R1 = адрес точки прерывания
BNE 174214$ ; Было прерывание
CALL @<174232$-7062>(R0); Вызов по стандартному адресу
BR 174164$ ; На начало цикла
174214$:CLR 22(R0) ; Очистить адрес прерывания
JMP @R1 ; Переход по адресу прерывания
; Фиктивная подпрограмма
174222$:MOV #174222$,@#7126; Установить точку прерывания фикт. п/п
BR 174164$ ; На начало цикла
; Адреса стандартных подпрограмм обработки событий :
; обработка скэн-кодов клавиатуры, обработка данных К2, вывод символов на
; экран, переключение курсора, меню УСТАНОВКА, меню ЗАГРУЗКА, вывод на
; принтер, запуск п/п пользователя, запуск теста
174232$:.WORD 104306$,125030$,111144$,176056$,100040$,100742$,176076$
.WORD 176116$,176460$
; Подпрограмма обработки команды TRAP 0
174254$:MOV @#7056,R0 ; R0 = адрес флага
MOV (SP)+,22(R0) ; Сохранить СК
MTPS (SP)+ ; Установить ССП
BR 174164$ ; На начало основного цикла
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО КОМАНДЕ EMT ***
174270$:MOV R5,-(SP) ; Сохранить регистры
MOV R4,-(SP)
MOV R3,-(SP)
MOV R2,-(SP)
MOV R1,-(SP)
MOV R0,-(SP)
MOV 14(SP),R5
MOV -(R5),R5 ; R5 = код команды EMT
CALL @<160000$-EMT>(R5); Вызов соответствующей подпрограммы
MOV (SP)+,R0 ; Восстановить регистры
MOV (SP)+,R1
MOV (SP)+,R2
MOV (SP)+,R3
MOV (SP)+,R4
MOV (SP)+,R5
RTI
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО КОМАНДЕ TRAP ***
174334$:MOV @SP,R0
MOV -(R0),R0 ; R0 = код команды TRAP
JMP @<160160$-TRAP>(R0); Переход на соответствующую подпрограмму
; Обработка прерываний сетевого таймера (скроллинг назад)
174344$:MOV R0,-(SP) ; Сохранить R0
ADD @#7136,PC ; Рулон плавный/дискретный ?
BR 174476$ ; Рулон плавный
174354$:MOV R1,-(SP) ; Сохранить R1
MOV @#23170,R1 ; R1 = число видеострок для скроллинга
NEG R1 ; Перевод в положительное число
ASL R1 ; Умножение на 4
ASL R1
MOV @#2476,R0 ; R0 = адр.яч.информ. о перв. стр. экр.польз.
ADD #264.*4,R0 ; Плюс размер видимой части экрана
CMP R0,#4670 ; Достигли конца описания ?
BLO 174424$ ; Нет
BHI 174420$ ; Превысили
MOV #2500,@#4666 ; Посл. строка - первая в описании
BR 174430$
174420$:SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз.
174424$:MOV R0,-2(R0) ; Поместить в область описания
174430$:SUB R1,R0 ; Вычесть число видеострок для скроллинга
CMP R0,#2500 ; Вышло за начало ?
BHI 174444$ ; Нет
ADD #286.*4,R0 ; R0 = R0 + общ. число видеострок экр. польз.
174444$:MOV #6742,-(R0) ; Адрес описания нижней инф. строки
MOV @#2476,R0 ; R0 = адр.яч.информ. о перв. стр. экр.польз.
SUB R1,R0 ; Вычесть число видеострок для скроллинга
CMP R0,#2500 ; Вышли за начало ?
BHIS 174470$ ; Нет
ADD #286.*4,R0 ; R0 = R0 + общ. число видеострок экр. польз.
174470$:MOV R0,@#2476 ; Адрес описания начала экр. пользователя
BR 174750$
174476$:MOV @#2476,R0 ; R0 = адр.яч.информ. о перв. стр. экр.польз.
SUB #4,R0 ; R0 = R0 - 1 видеострока
CMP R0,#2500 ; Вышли за начало ?
BHIS 174520$ ; Нет
ADD #286.*4,R0 ; R0 = R0 + общ. число видеострок экр. польз.
174520$:MOV R0,@#2476 ; Адрес описания начала экр. пользователя
ADD #265.*4,R0 ; R0 = R0 + 265 строк
CMP R0,#4670 ; Вышли за конец
BLO 174554$ ; Нет
BNE 174550$ ; Да
MOV #2500,@#4666 ; Посл. строка - первая в описании
BR 174560$
174550$:SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз.
174554$:MOV R0,-2(R0) ; Поместить в область описания
174560$:SUB #4,R0 ; R0 = R0 - 1 видеострока
CMP R0,#2500 ; На начале ?
BNE 174576$
ADD #286.*4,R0 ; R0 = R0 + общ. число видеострок экр. польз.
174576$:MOV #6742,-(R0) ; Адрес описания нижней инф. строки
MOV (SP)+,R0 ; Восстановить R0
INC @#23170 ; Уменьшить число видеострок для скроллинга
BR 175054$
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ СЕТЕВОГО ТАЙМЕРА ***
174612$:TST @#23170 ; Количество видеострок для скроллинга
BEQ 175072$ ; Нет
BMI 174344$ ; Скроллинг назад
MOV R0,-(SP) ; Сохранить R0
ADD @#7136,PC ; Рулон плавный/дискретный ?
BR 174762$ ; Рулон плавный
174632$:MOV R1,-(SP) ; Сохранить R1
MOV @#23170,R1 ; R1 = число видеострок для скроллинга
ASL R1 ; Умножение на 4
ASL R1
MOV @#2476,R0 ; R0 = адр.яч.информ. о перв. стр. экр.польз.
ADD #264.*4,R0 ; Плюс размер видимой части экрана
CMP R0,#4670 ; Достигли конца описания ?
BLO 174700$ ; Нет
BHI 174674$ ; Превысили
MOV #2500,@#4666 ; Посл. строка - первая в описании
BR 174704$
174674$:SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз.
174700$:MOV R0,-2(R0) ; Поместить в область описания
174704$:ADD R1,R0 ; Прибавить число видеострок для скроллинга
CMP R0,#4670 ; Вышли за конец ?
BLOS 174720$ ; Нет
SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз.
174720$:MOV #6742,-(R0) ; Адрес описания нижней инф. строки
MOV @#2476,R0 ; R0 = адр.яч.информ. о перв. стр. экр.польз.
ADD R1,R0 ; Прибавить число видеострок для скроллинга
CMP R0,#4670 ; Вышли за конец ?
BLO 174744$ ; Нет
SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз.
174744$:MOV R0,@#2476 ; Адрес описания начала экр. пользователя
174750$:MOV (SP)+,R1 ; Восстановить регистры
MOV (SP)+,R0
CLR @#23170 ; Число строк для скроллинга = 0
BR 175056$
174762$:MOV @#2476,R0 ; R0 = адр.яч.информ. о перв. стр. экр.польз.
BIC #1,2(R0) ; Сбросить бит переключения курсора
MOV 2(R0),@#2476 ; Сдвиг на 1 строку вверх
ADD #264.*4,R0 ; R0 = R0 + 264 видеостроки
CMP R0,#4670 ; Вышли за конец ?
BLO 175034$ ; Нет
BNE 175030$ ; Да
MOV #2500,R0 ; R0 = первый элемент описания
MOV R0,@#4666 ; Посл. строка - первая в описании
BR 175040$
175030$:SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз.
175034$:MOV R0,-2(R0) ; Поместить в область описания
175040$:MOV #6742,2(R0) ; Адрес описания нижней инф. строки
MOV (SP)+,R0 ; Восстановить R0
DEC @#23170 ; Уменьшить число видеострок для скроллинга
175054$:BNE 175306$ ; Еще остались
175056$:MOV @#22750,@#23164; Разрешение/запрет использования курсора
INC @#7066 ; Уст.флаг вызова п/п перекл. курсора
BR 175306$
175072$:ADD @#7134,PC ; Перекл. курсор/не изм. курсор/выдержка вр.
BR 175150$ ; Перекл. курсор, поменять его координаты
175102$:BR 175306$ ; Не изм. состояния курсора
175104$:DECB @#23166 ; Уменьшить счетчик выдержки времени
BGT 175306$ ; Время еще не окнчилось
BEQ 175120$ ; Время закончилось
MOV #110060,@#23162; Загрузить временной интервал
175120$:MOV @#23162,@#23166; Загрузить значение в счетчик
SWAB @#23162 ; Поменять параметры выдержки(горит/не горит)
BMI 175300$ ; Включить курсор
ASL @#23166
175140$:MOVB #177,@23160 ; Убрать курсор с экрана
BR 175306$
175150$:MOV R0,-(SP) ; Сохранить регистры
MOV R1,-(SP)
MOV R5,-(SP)
MOV @#23150,R5 ; R5 = адрес текущей таблицы видеопараметров
MOV @R5,R0 ; R0 = текущий адрес видео
SUB @32(R5),R0 ; R0 = тек.адрес - адр.нач.строки = позиция X
MOV 66(R5),R1 ; R1 = режим экрана (80/40/20/10)
BR 175200$
175176$:ASL R0 ; Приведение координат в соотв. с режимом
175200$:ROR R1
BCC 175176$
MOV R0,@#23156 ; Сохранить координату X
MOV 60(R5),R1 ; R1 = адрес списка строк, где расп. курсор
BIC #1,6(R1) ; Выключить курсор
BIC #1,52(R1)
MOV 32(R5),60(R5) ; Новые координаты курсора
MOV 60(R5),R1
BIS #1,6(R1) ; Включить курсор
BIS #1,52(R1)
MOV #4,@#7134 ; Режим мигания курсора
MOV (SP)+,R5 ; Восстановить регистры
MOV (SP)+,R1
MOV (SP)+,R0
CLR @#23166 ; Сброс временных параметров курсора
BR 175140$
175300$:MOVB @#23156,@23160 ; Поместить курсор в позицию X
175306$:TST @#7130 ; Двигатель НГМД вращается ?
BEQ 175326$ ; Нет
DEC @#7130 ; Уменьшить счетчик вращения двигателя
BNE 175326$ ; Еще не конец
CALL @7132 ; Вызов п/п выключения двигателя НГМД
175326$:DEC @#7046 ; Уменьшить сч. длительности звукового сигн.
BNE 175342$ ; Еще не конец
BIC #17600,@#177716; Выключить звуковой сигнал
175342$:TSTB @#7227 ; Есть данные для автоповтора клавиш
BEQ 175376$ ; Да
DECB @#7227 ; Уменьшить сч. автоповтора
BNE 175376$ ; Еще не конец
INC @#7060 ; Увеличить флаг вызова п/п обр. соб. клав.
BIS #200,@#177716 ; Подать полож.импульс на динамик (щелчок)
MOV #1,@#7046 ; Длительность импульса
175376$:RTI
; Подпрограмма заполнения ячеек информацией о длительности вращения
; двигателя НГМД и адресе п/п выключения двигателя
175400$:MOV (R5)+,@#7130 ; Длительность вращения двигатель НГМД
MOV (R5)+,@#7132 ; Адрес п/п выключения двигателя НГМД
RTS R5
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ КЛАВИАТУРЫ ***
175412$:MOVB @#177702,@7200 ; Занести скэн-код клавиши в буфер
BMI 175436$ ; Клавиша отжата
BIS #200,@#177716 ; Подать полож.импульс на динамик (щелчок)
MOV #2,@#7046 ; Длительность импульса
175436$:CMPB @7200,#4 ; Нажата клавиша <СТОП> ?
BEQ 175466$ ; Да
INC @#7200 ; Передвинуть указатель на след. позицию
BIC #10,@#7200
INC @#7060 ; Увеличить флаг вызова п/п обр. соб. клав.
RTI
175466$:MOV R0,-(SP) ; Сохранить регистры
MOV R1,-(SP)
MOV R2,-(SP)
CALL 104054$ ; Очистка буферов клавиатуры
MOV (SP)+,R2 ; Восстановить регистры
MOV (SP)+,R1
MOV (SP)+,R0
BIS #20,@#177716 ; Установить сигнал HALT в ЦП
RTI
; Подпрограмма исполнения команды TRAP 2
175516$:CLR @#7230 ; Запрет вызова TRAP 2 п/п обсл. клав.
ADD @#7042,PC ; Передача данных по К0/в R0
BR 175540$ ; Передача в R0
175530$:BIT #10,@#177076 ; Готовность передатчика К0
BEQ 175646$ ; Не готов
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПЕРЕДАТЧИКА КАНАЛА 0(КЛАВИАТУРА) ***
175540$:MOV R5,-(SP) ; Сохранить R5
MOV @#7206,R5 ; R5 = указатель для чтения с буфера ASCII
175546$:CMP R5,@#7210 ; Буфер пуст ?
BEQ 175650$ ; Да
TSTB 1(R5) ; Данное слово содержит одиночный код ?
BEQ 175620$ ; Да
CLR -(SP)
MOVB @(R5),@SP ; Поместить в стек очередной символ из строки
BNE 175606$ ; Еще не конец строки символов
CMP (R5)+,(SP)+ ; Указатель на след. позицию
BIC #40,R5
MOV R5,@#7206
BR 175546$
175606$:INC @R5 ; К следующему символу в строке
MOV #177,R5
175614$:SOB R5,175614$ ; Задержка
BR 175632$
175620$:MOV (R5)+,-(SP) ; Поместить символ в стек
BIC #40,R5
MOV R5,@#7206
175632$:ADD @#7042,PC ; Передача данных по К0/в R0
BR 175660$ ; Передача в R0
175640$:MOV (SP)+,@#177070 ; Передача символа в К0
175644$:MOV (SP)+,R5 ; Восстановить R5
175646$:RTI
175650$:MOV #2,@#7230 ; Разрешение вызова TRAP 2 п/п обсл. клав.
BR 175644$
175660$:MOV (SP)+,R0 ; Передача символа в R0
BR 175644$
; Подпрограмма исполнения команды TRAP 4
175664$:CLR @#22546 ; Запрет вызова TRAP 4 п/п обсл. терминала
BIT #10,@#177066 ; Готовность приемника К0
BEQ 175742$ ; Не готов
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 0(ТЕРМИНАЛ) ***
175700$:ADD @#7042,PC ; Передача данных по К0/в R0
BR 175752$ ; Передача в R0
175706$:CMP @#7064,#177 ; Буфер заполнен полностью ?
BEQ 175744$ ; Да
MOVB @#177060,@22544; Занести символ в буфер
INC @#22544 ; Подкорректировать указатель буфера
BIC #200,@#22544
INC @#7064 ; Увеличить флаг вызова п/п обсл. терм.
175742$:RTI
175744$:MOV #2,@#22546 ; Разрешение выз. TRAP 4 п/п обсл. терминала
175752$:RTI
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 1(ПРИНТЕР) ***
175754$:INC @#7074 ; Уст. флаг вызова п/п обсл. принтера
RTI
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 2 ***
175762$:MOV R0,-(SP) ; Сохранить R0
MOV @#23202,R0 ; R0 = счетчик принятых байтов
BMI 176046$ ; В состоянии инициализации
CMP R0,#2 ; Адрес МП передан
BHIS 176016$ ; Да
MOVB @#177064,23200(R0); Передача данных в буфер (адрес МП)
176006$:INC @#23202 ; Увеличить счетчик принятых байтов
176012$:MOV (SP)+,R0 ; Восстановить R0
RTI
176016$:BNE 176034$ ; Принято 3 байта
TSTB @#177064 ; 3-й байт равен нулю ?
BNE 176006$ ; Нет
COM @#23202 ; Инвертировать счетчик (инициализация канала)
BR 176012$
176034$:INC @#7062 ; Установить флаг вызова п/п обсл. К2
176040$:CLR @#23202 ; Очистить счетчик
BR 176012$
176046$:TSTB @#177064 ; Принятый байт равен нулю ?
BEQ 176012$ ; Да
BR 176040$
; Подпрограмма переключения режима курсора
176056$:CLR @#7066 ; Очистка флага вызова п/п
ADD @#23164,PC ; Разрешение / запрет использования курсора
RETURN ; Запрет использования курсора
176070$:CLR @#7134 ; Поменять позицию курсора и включить его
RETURN
; Подпрограмма печати символа на принтере, переданного по К1
176076$:CLR @#7074 ; Очистить флаг вызова п/п
MOV @#177062,-(SP) ; Поместить символ в стек
CALL 135722$ ; Печать символа на принтере
TST (SP)+
RETURN
; Подпрограмма вызова процедуры пользователя
176116$:CALL @7140 ; Вызов процедуры пользователя
CLR @#7076 ; Очистить флаг вызова п/п
RETURN
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО ПОЯВ. НА КАНАЛЕ ЦП СИГНАЛА RESET ***
176130$:RTI
; Подпрограмма запроса блока памяти
176132$:MOV R0,R1 ; R1 = размер запрашиваемого блока
BMI 176142$ ; Найти максимальный блок
ROR R1 ; Приведение к четному адресу
ADC R0
176142$:MOV R2,-(SP) ; Сохранить R2
CLR R2 ; R2 = адрес найденного блока
CLR -(SP) ; Размер найденного блока
176150$:MOV #23660,R1 ; R1 = адрес начала ОЗУ пользователя
176154$:TST (R1)+ ; Блок занят ?
BEQ 176176$ ; Нет
TST (R1)+
176162$:ADD (R1)+,R1 ; Переход к следующему блоку
BPL 176154$ ; Еще не конец ОЗУ
TST R2 ; Найден свободный блок ?
BNE 176150$ ; Да
CLR R0 ; Нет свободной памяти
BR 176272$
176176$:TST (R1)+
CMP R0,@R1 ; Размер блока равен или больше запраш. ?
BLOS 176226$ ; Да
CMP R1,R2 ; Это найденный максимальный блок
BEQ 176222$ ; Да
CMP @R1,@SP ; Меньше запраш. размера ?
BLOS 176162$ ; Да
MOV R1,R2 ; R2 = адрес найденного макс. блока
MOV @R1,@SP ; Сохранить размер блока
BR 176162$
176222$:MOV @SP,R0 ; R0 = размер найденного макс. блока
BR 176232$
176226$:INC -4(R1) ; Пометить блок, как занятый
176232$:MOV (R1)+,R2 ; R2 = размер блока
SUB #6,R2 ; Отнять размер заголовка
CMP R0,R2 ; Запраш. размер больше реального ?
BHIS 176272$ ; Да
MOV R1,R2
ADD R0,R2 ; R2 = адрес следующего блока
CLR (R2)+ ; Пометить блок, как свободный
MOV R1,@R2
SUB #6,(R2)+ ; Ссылка на предыдущий блок
MOV -(R1),@R2 ; Вычисление размера блока
SUB R0,@R2
SUB #6,@R2
MOV R0,(R1)+ ; Размер выделенного блока
176272$:TST (SP)+
MOV (SP)+,R2 ; Восстановить R2
RETURN
; Подпрограмма освобождения блока памяти
176300$:TST R1 ; Освободить блок или всю память ?
BPL 176310$ ; Освободить блок
JMP 173706$ ; Освободить всю память
176310$:MOV #23660,R0 ; R0 = адрес начала ОЗУ пользователя
176314$:ADD #6,R0 ; Плюс размер заголовка
BMI 176374$ ; Достигнут конец ОЗУ
CMP R0,R1 ; Адрес освоб. блока равен текущему
BEQ 176342$ ; Да
ADD -2(R0),R0 ; Переход к следующему блоку
BR 176314$
176334$:MOV @R1,R1 ; R1 = адрес предыдущего блока
ADD #6,R1 ; Плюс размер заголовка
176342$:CLR -6(R1) ; Пометить блок, как свободный
TST -(R1)
MOV R1,R0 ; R0 = адрес блока (поле размера)
ADD (R0)+,R0 ; Переход к следующему блоку
TST @R0 ; Блок занят ?
BNE 176370$ ; Да
ADD 4(R0),@R1 ; Прибавить размер к предыд. (слияние)
ADD #6,@R1 ; Плюс размер заголовка
176370$:TST @-(R1) ; Блок выше свободный ?
BEQ 176334$ ; Да
176374$:RETURN
; Подпрограмма резервирования программируемого таймера за процессом
176376$:TST @#7050 ; Программируемый таймер занят ?
BEQ 176416$ ; Да
CLR @#177710 ; Останов таймера
CLR @#7050 ; Таймер занят
RETURN
176416$:SEC ; Признак занятости таймера
RETURN
; Подпрограмма освобождения процессом программируемого таймера
176422$:MOV #4,@#7050 ; Признак свободного таймера
MOV #174612$,@#304 ; Восстановить вектор прерывания
MOV #200,@#306
CLR @#177712 ; Очистить буферный регистр таймера
MOV #1,@#177710 ; Пуск таймера
RETURN
; Подпрограмма запуска тестов в ПП
176460$:CALL 176472$ ; Запустить тесты
CLR @#7100 ; Очистить флаг вызова п/п
RETURN
; Подпрограмма вызова тестов и передачи результатов в ОЗУ ЦП
176472$:MTPS #200 ; Запретить прерывания
MOV #176656$,@#300 ; Переназначить вектор прерывания клавиатуры
CALL 160410$ ; Тест ПЗУ
CLR R1 ; R1 = 0 (смещение в буфере ошибок)
176512$:ASR R0
BCS 176522$ ; Ошибка банка ПЗУ
BNE 176526$ ; Еще есть ошибки
BR 176532$
176522$:CALL 176626$ ; Установка счетчика ошибок в ОЗУ ЦП
176526$:INC R1 ; Переход к след.ячейке в ОЗУ ЦП
BR 176512$
176532$:CALL 170632$ ; Тест процессора
MTPS #0 ; Разрешить прерывания
TST R0 ; Есть ошибки ?
BEQ 176556$ ; Нет
MOV #5,R1 ; R1 = 5 (смещение в буфере ошибок)
CALL 176626$ ; Установка счетчика ошибок в ОЗУ ЦП
176556$:MOV #-1,R0
CALL 176132$ ; Получить адрес наиб. блока памяти
MOV R1,R4 ; R4 = начальный адрес
MOV R1,R5
ADD R0,R5 ; R5 = конечный адрес
CALL 170224$ ; Тест оперативной памяти
TST R0 ; Есть ошибки
BEQ 176614$ ; Нет
MOV #4,R1 ; R1 = 4 (смещение в буфере ошибок)
CALL 176626$ ; Установка счетчика ошибок в ОЗУ ЦП
176614$:MOV #177,R0
CALL 104160$ ; Посл. ЦП по К0 символ с кодом 177(тест окон.)
RETURN
; Подпрограмма установки счетчика ошибок в ОЗУ ЦП
176626$:MOV #<177700/2>&77777,@#177010; Адрес буфера счетчиков ошибок
ADD R1,@#177010 ; Прибавить смещение
CMP #-1,@#177014 ; Значение счетчика достигло максимума
BEQ 176654$ ; Да
INC @#177014 ; Увеличить значение счетчика ошибок
176654$:RETURN
; Подпрограмма обработки прерываний от клавиатуры во время тестирования
176656$:CMP #4,@#177702 ; Нажата клавиша <СТОП> ?
BNE 176672$ ; Нет
JMP @160000$ ; Перезапуск компьютера
176672$:RTI
; *****************************************************************
; * *
; * КОНТРОЛЬНЫЕ СУММЫ БЛОКОВ ПЗУ *
; * *
; * *
; * Адреса 176770 - 176777 *
; * *
; *****************************************************************
.=176770
176770$:.WORD 63160 ; Адреса 100000 - 117777
176772$:.WORD 133314 ; Адреса 120000 - 137777
176774$:.WORD 162125 ; Адреса 140000 - 157777
176776$:.WORD 103607 ; Адреса 160000 - 176775
; * * * * * * * * * * * E n d o f R O M * * * * * * * * * * *
.END
Русская версия Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)