УКНЦ ROM disasm 6: различия между версиями
Nzeemin (обсуждение | вклад) (Новая страница: «{{ДИ}} <pre> ; ***************************************************************** ; * * ; * ПР…») |
Nzeemin (обсуждение | вклад) м (категория) |
||
Строка 2655: | Строка 2655: | ||
</pre> | </pre> | ||
[[Категория:УКНЦ]] | [[Категория:УКНЦ|R]] |
Текущая версия от 17:20, 29 марта 2020
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. |
; ***************************************************************** ; * * ; * ПРОГРАММА НАЧАЛЬНОГО ЗАПУСКА СИСТЕМЫ, ПУЛЬТОВЫЙ МОНИТОР, * ; * ЗАГРУЗЧИКИ, ТЕСТОВЫЕ ПОДПРОГРАММЫ, ОБРАБОТЧИКИ ПРЕРЫВАНИЙ * ; * * ; * Адреса 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