From Felixl.com
; *****************************************************************
; * *
; * ПРОГРАММА НАЧАЛЬНОГО ЗАПУСКА СИСТЕМЫ, ПУЛЬТОВЫЙ МОНИТОР, *
; * ЗАГРУЗЧИКИ, ТЕСТОВЫЕ ПОДПРОГРАММЫ, ОБРАБОТЧИКИ ПРЕРЫВАНИЙ *
; * *
; * Адреса 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