Difference between revisions of "Uknc ROM disasm - 6"
From Felixl.com
Jump to navigationJump to search (Исправлены ошибки) |
|||
| Line 1: | Line 1: | ||
<pre> | <pre> | ||
| + | |||
; ***************************************************************** | ; ***************************************************************** | ||
; * * | ; * * | ||
| Line 30: | Line 31: | ||
; ***************************************************************** | ; ***************************************************************** | ||
| − | + | $MFPC$ = 22 | |
| + | $MFPS$ = 24 | ||
| + | $MTPC$ = 32 | ||
| + | $MTPS$ = 34 | ||
| + | $MFPM$ = 21 | ||
| + | $MTPM$ = 31 | ||
| + | $STEP$ = 16 | ||
| + | $RUN$ = 12 | ||
| − | 160000$:.WORD 160300$,200 ; Вектор прерывания по включению питания | + | .=160000 |
| − | 160004$:.WORD 160230$,600 ; Вектор прерывания по зависанию (HALT) | + | |
| − | 160010$:.WORD 165612$,600 ; Вектор прерывания по инструкции FIS | + | 160000$:.WORD 160300$,200 ; Вектор прерывания по включению питания |
| + | 160004$:.WORD 160230$,600 ; Вектор прерывания по зависанию (HALT) | ||
| + | 160010$:.WORD 165612$,600 ; Вектор прерывания по инструкции FIS | ||
; Адреса подпрограмм обработки прерываний EMT 14 - EMT 24 | ; Адреса подпрограмм обработки прерываний EMT 14 - EMT 24 | ||
| − | 160014$:.WORD 173502$,160270$,103564$,104132$,104132$ | + | 160014$:.WORD 173502$,160270$,103564$,104132$,104132$ |
; "Пустые" адреса | ; "Пустые" адреса | ||
| − | 160026$:.REPT | + | 160026$:.REPT 5 |
| − | + | .WORD 160270$ | |
| − | + | .ENDR | |
; Адреса подпрограмм обработки прерываний EMT 40 - EMT 76 | ; Адреса подпрограмм обработки прерываний EMT 40 - EMT 76 | ||
| − | 160040$:.WORD 107754$,117126$,117162$,117174$ | + | 160040$:.WORD 107754$,117126$,117162$,117174$ |
| − | + | .WORD 117406$,117250$,117410$,117240$ | |
| − | + | .WORD 117412$,117414$,117416$,117420$ | |
| − | + | .WORD 117422$,160270$,117424$,117426$ | |
; "Пустые" адреса | ; "Пустые" адреса | ||
| − | 160100$:.REPT 30 | + | 160100$:.REPT 30 |
| − | + | .WORD 160270$ | |
| − | + | .ENDR | |
; Адреса подпрограмм обработки прерываний TRAP 0 - TRAP 6 | ; Адреса подпрограмм обработки прерываний TRAP 0 - TRAP 6 | ||
| − | 160160$:.WORD 174254$,175516$,175664$,160270$ | + | 160160$:.WORD 174254$,175516$,175664$,160270$ |
| − | 160170$:.WORD 160240$,600 ; Вектор прерывания по команде | + | 160170$:.WORD 160240$,600 ; Вектор прерывания по команде HALT |
| − | 160174$:.WORD 160250$,600 ; Вектор прерывания по двойному зависанию | + | 160174$:.WORD 160250$,600 ; Вектор прерывания по двойному зависанию |
; Точка входа обработчика прерывания 4 | ; Точка входа обработчика прерывания 4 | ||
| − | 160200$:MOV #163627$,@172662$ | + | 160200$:MOV #163627$,@172662$ |
| − | + | BR 160266$ | |
; Точка входа обработчика прерывания 10 | ; Точка входа обработчика прерывания 10 | ||
| − | 160210$:MOV #163641$,@172662$ | + | 160210$:MOV #163641$,@172662$ |
| − | + | BR 160614$ | |
; Точка входа обработчика прерывания 24 | ; Точка входа обработчика прерывания 24 | ||
| − | 160220$:MOV #163657$,@172662$ | + | 160220$:MOV #163657$,@172662$ |
| − | + | BR 160614$ | |
; Точка входа обработчика прерывания 160004 | ; Точка входа обработчика прерывания 160004 | ||
| − | 160230$:MOV #163627$,@172662$ | + | 160230$:MOV #163627$,@172662$ |
| − | + | BR 160574$ | |
; Точка входа обработчика прерывания 160170 | ; Точка входа обработчика прерывания 160170 | ||
| − | 160240$:MOV #163731$,@172662$ | + | 160240$:MOV #163731$,@172662$ |
| − | + | BR 160614$ | |
; Точка входа обработчика прерывания 160174 | ; Точка входа обработчика прерывания 160174 | ||
| − | 160250$:MOV #163707$,@172662$ | + | 160250$:MOV #163707$,@172662$ |
| − | + | BR 160614$ | |
; Точка входа обработчика прерывания 160274 | ; Точка входа обработчика прерывания 160274 | ||
| − | 160260$:MOV #163736$,@172662$ | + | 160260$:MOV #163736$,@172662$ |
| − | 160266$:BR 160614$ | + | 160266$:BR 160614$ |
160270$:RETURN | 160270$:RETURN | ||
| − | 160272$:.WORD 161236$ | + | 160272$:.WORD 161236$ ; Адрес п/п снятия режима HALT (для ЦП) |
| − | 160274$:.WORD 160260$,600 ; Вектор прерывания по зависанию при приеме АВП | + | 160274$:.WORD 160260$,600 ; Вектор прерывания по зависанию при приеме АВП |
; Точка входа при включении питания (адрес начального пуска) | ; Точка входа при включении питания (адрес начального пуска) | ||
| − | 160300$:MOV @#172660$,R4 ; R4 = адрес ОЗУ пультового отладчика | + | 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 | + | 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$ ; Задержка | + | 160370$:SOB R0,160370$ ; Задержка |
| − | + | MOV #100000,@#177716; Запуск ЦП (снятие ACLO) | |
| − | + | CALL 160410$ ; Тест ПЗУ ПП | |
| − | + | SWAB R0 | |
| − | + | BR 160474$ ; Переход на тест ОЗУ | |
; Подпрограмма теста ПЗУ ПП | ; Подпрограмма теста ПЗУ ПП | ||
| − | 160410$:MOV #4,R5 | + | 160410$:MOV #4,R5 ; R5 = число банков ПЗУ |
| − | + | MOV #176776,R1 ; R1 = конечный адрес ПЗУ | |
| − | + | MOV #7377,R2 ; R2 = число слов последнего банка ПЗУ | |
| − | + | CLR R0 ; Очистка признака ошибок | |
| − | 160426$:ASL R0 | + | 160426$:ASL R0 ; Освободить правый бит |
| − | + | CLR R3 | |
| − | 160432$:ADD -(R1),R3 ; Вычисление контрольной суммы | + | 160432$:ADD -(R1),R3 ; Вычисление контрольной суммы |
| − | + | ADC R3 | |
| − | + | SOB R2,160432$ | |
| − | + | ASL R5 | |
| − | + | CMP <176770$-2>(R5),R3 ; Сравнение с записанной в ПЗУ | |
| − | + | BEQ 160452$ ; Совпадает | |
| − | + | INC R0 ; Установить правый бит | |
| − | 160452$:ASR R5 | + | 160452$:ASR R5 |
| − | + | MOV #10000,R2 ; R2 = число слов в 1,2 и 3 банках ПЗУ | |
| − | + | SOB R5,160426$ | |
| − | + | RETURN | |
| − | 160464$:CMP 42(R4),#125252 ; Производить тест ОЗУ | + | 160464$:CMP 42(R4),#125252 ; Производить тест ОЗУ |
| − | + | BEQ 160534$ ; Нет | |
| − | 160474$:CLR R1 | + | 160474$:CLR R1 ; R1 = начальный адрес |
| − | + | MOV @#172674$,R2 ; R2 = объем ОЗУ в словах | |
| − | 160502$:MOV R1,@R1 | + | 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 | + | 160530$:BIS #2,R0 ; Установить признак ошибки ОЗУ |
| − | 160534$:MOV R4,R1 | + | 160534$:MOV R4,R1 ; R1 = адрес ОЗУ пультового отладчика |
| − | + | MOV #50,R2 ; R2 = объем ОЗУ пультового отладчика | |
| − | 160542$:CLR (R1)+ | + | 160542$:CLR (R1)+ ; Цикл очистки |
| − | + | SOB R2,160542$ | |
| − | + | MOV @#172672$,14(R4); Начальное значение указателя стека | |
| − | + | MOV #200,20(R4) ; Начальное значение слова состояния | |
| − | + | MOV #125252,42(R4) ; Ключ пропуска теста ОЗУ | |
| − | + | JMP 172676$ | |
| − | 160574$:BR 160744$ | + | 160574$:BR 160744$ |
; Точка перехода из режима УСТАНОВКА при нажатии УПР-@ (пультовый монитор ПП) | ; Точка перехода из режима УСТАНОВКА при нажатии УПР-@ (пультовый монитор ПП) | ||
| − | 160576$:MOV #600,-(SP) ; Записать в стек слово состояния | + | 160576$:MOV #600,-(SP) ; Записать в стек слово состояния |
| − | + | MOV #160744$,-(SP) ; Записать в стек адрес начала пульт. отл. | |
| − | + | CLR @172662$ ; Адрес выводимой надписи = 0 | |
| − | + | RTI ; Переход в пультовый отладчик | |
; Точка входа при обработке системных прерываний (адрес векторов 160***) | ; Точка входа при обработке системных прерываний (адрес векторов 160***) | ||
| − | 160614$:CLR @172664$ ; Адрес открытой ячейки = 0 | + | 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 | + | 160676$:MOV #4,R2 ; R2 = число точек останова |
| − | + | SUB #2,R3 ; R3 = предполагаемый адрес останова | |
| − | 160706$:MOV 50(R1),R5 ; R5 = адрес точки останова | + | 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 | + | 160736$:ADD #2,R1 ; Переход к следующей точке останова |
| − | + | SOB R2,160706$ | |
| − | 160744$:MOV @#172660$,R4 ; R4 = начальный адрес ОЗУ пультового отладчика | + | 160744$:MOV @#172660$,R4 ; R4 = начальный адрес ОЗУ пультового отладчика |
| − | + | MOV R4,SP | |
| − | + | BMI 160762$ ; Исполнение в ЦП | |
| − | + | MOV #2,@#22550 ; Запрет перевода ЦП в режим HALT при Esc Гр-] | |
| − | 160762$:MOV #70,26(R4) ; Установка указателя на начало буфера | + | 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$ | + | 161030$:CALL 163316$ ; Вывод причины останова, адр. ячейки и ее сод. |
| − | 161034$:MOV R4,SP | + | 161034$:MOV R4,SP |
| − | + | JSR R4,163006$ ; Вывод промптера /@ / | |
| − | + | .WORD 163510$ | |
| − | 161044$:CALL 162602$ | + | 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$ | + | 161150$:JMP 161530$ |
| − | 161154$:JMP 162460$ | + | 161154$:JMP 162460$ |
; Обработка вызова меню загрузки (M) | ; Обработка вызова меню загрузки (M) | ||
| − | 161160$:JSR R4,163006$ ; Вызов меню загрузки | + | 161160$:JSR R4,163006$ ; Вызов меню загрузки |
| − | + | .WORD 163505$ | |
| − | + | CALL 172614$ ; Прочесть данные из канала 0 (номер пункта) | |
| − | + | MOV R0,R1 ; R1 = номер выбранного пункта * 2 | |
| − | + | CALL 172614$ ; Прочесть данные из канала 0 (номер уст-ва) | |
| − | + | CALL @162350$(R1) ; Вызов соответствующей п/п | |
| − | + | BR 161160$ | |
; Обработка выхода из пультового отладчика (УПР-C) | ; Обработка выхода из пультового отладчика (УПР-C) | ||
| − | 161206$:TST R4 | + | 161206$:TST R4 ; Пультовый монитор работает под упр. ПП ? |
| − | + | BMI 161034$ ; Нет | |
| − | + | CLR @#22550 | |
| − | + | MTPS #600 | |
| − | + | MOV @#7144,SP ; Восстановить стек режима УСТАНОВКА | |
| − | + | CLR R0 | |
| − | + | $MTPS$ ; PS = 0 | |
| − | + | $MTPC$ ; PC = 0 | |
| − | + | $RUN$ ; Запуск по адресу 0(там RETURN, возврат в УСТ) | |
; П/п снятия в ЦП сигнала HALT | ; П/п снятия в ЦП сигнала HALT | ||
| − | 161236$:MOV R0,-(SP) | + | 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) | + | 161262$:TST 44(R4) ; Ключ продолжения сброшен ? |
| − | + | BNE 161262$ ; Нет | |
| − | + | MOV (SP)+,R4 | |
| − | + | MOV (SP)+,R1 | |
| − | + | MOV (SP)+,R0 | |
| − | + | RETURN | |
; Обработка команды очистки экрана (<СБРОС>) (R0 = 14) | ; Обработка команды очистки экрана (<СБРОС>) (R0 = 14) | ||
| − | 161300$:CALL 172632$ | + | 161300$:CALL 172632$ ; Вывод символа УПР-L |
| − | + | BR 161034$ | |
; Обработка клавиш с префиксом Esc | ; Обработка клавиш с префиксом Esc | ||
| − | 161306$:CALL 162756$ | + | 161306$:CALL 162756$ ; Прочесть очер. код клавиши с его коррекцией |
| − | + | CALL @161556$(R0) ; Вызвать соответствующую п/п | |
| − | + | BR 161044$ | |
; Обработка команды переключения на регистры (R) | ; Обработка команды переключения на регистры (R) | ||
| − | 161320$:MOV #10*400+'R,32(R4); Режим работы (10(8) регистров) | + | 161320$:MOV #10*400+'R,32(R4); Режим работы (10(8) регистров) |
| − | + | BR 161336$ | |
; Обработка команды переключения на точки останова (A) | ; Обработка команды переключения на точки останова (A) | ||
| − | 161330$:MOV #4*400+'A,32(R4); Режим работы (4 точки останова) | + | 161330$:MOV #4*400+'A,32(R4); Режим работы (4 точки останова) |
| − | 161336$:CALL 163370$ | + | 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$ | + | 161402$:CALL 163142$ ; Вывод всех регистров или точек останова |
| − | + | BR 161034$ | |
| − | 161410$:BICB 33(R4),R0 | + | 161410$:BICB 33(R4),R0 |
| − | + | CALL 172632$ ; Вывод номера регистра или точки останова | |
| − | 161420$:CALL 163234$ | + | 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 ; Работа производится с регистрами ? | + | 161470$:CMPB 32(R4),#'R ; Работа производится с регистрами ? |
| − | + | BNE 161352$ ; Нет | |
| − | + | CALL 172632$ ; Вывод символа 'S' (R0 = 'S') | |
| − | + | MOV #10,R3 ; R3 = номер регистра (PS) | |
| − | + | BR 161420$ | |
| − | 161512$:CMP R0,#40 | + | 161512$:CMP R0,#40 ; Нажат <Пробел> ? |
| − | + | BNE 161524$ ; Нет | |
| − | + | JMP 161606$ ; Да | |
| − | 161524$:JMP 161062$ | + | 161524$:JMP 161062$ |
; Обработка команды перехода в автономный режим (D) | ; Обработка команды перехода в автономный режим (D) | ||
| − | 161530$:MOV #14,R0 | + | 161530$:MOV #14,R0 ; R0 = Ctrl+L (очистка экрана) |
| − | 161534$:CALL 172632$ | + | 161534$:CALL 172632$ ; Вывести символ на экран |
| − | + | CALL 172614$ ; Ввести символ с клавиатуры | |
| − | + | CMP R0,#3 ; Нажата комбинация УПР+C ? | |
| − | + | BNE 161534$ ; Нет | |
| − | + | JMP 161034$ ; Переход в пультовый монитор | |
; Адреса п/п обработки клавиш с префиксом Esc (ПОМ,ИСП,Вверх,Вниз,Влево, | ; Адреса п/п обработки клавиш с префиксом Esc (ПОМ,ИСП,Вверх,Вниз,Влево, | ||
; Вправо,НР+Вверх,НР+Вниз,НР+Влево,НР+Вправо,?,?) | ; Вправо,НР+Вверх,НР+Вниз,НР+Влево,НР+Вправо,?,?) | ||
| − | 161556$:.WORD 162572$,161612$,161762$,161770$ | + | 161556$:.WORD 162572$,161612$,161762$,161770$ |
| − | + | .WORD 161772$,162026$,162132$,162040$ | |
| − | + | .WORD 162132$,162046$,162164$,162204$ | |
; Обработка команды "шаг" (<Пробел>) | ; Обработка команды "шаг" (<Пробел>) | ||
| − | 161606$:CLR R3 | + | 161606$:CLR R3 ; R3 = режим STEP |
| − | + | BR 161616$ | |
; Обработка команды "пуск" (<ИСП>) | ; Обработка команды "пуск" (<ИСП>) | ||
| − | 161612$:MOV #2,R3 | + | 161612$:MOV #2,R3 ; R3 = режим RUN |
| − | 161616$:MTPS #600 | + | 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 | + | 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 = адрес точки останова | + | 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 | + | 161712$:ADD #2,R1 ; Переход к следующей точке останова |
| − | + | SOB R2,161662$ | |
| − | + | CALL 161236$ ; Снятие в ЦП сигнала HALT | |
| − | 161724$:MOV R4,SP | + | 161724$:MOV R4,SP ; SP = начальный адрес ОЗУ пультового отладчика |
| − | + | BMI 161734$ ; Пультовый отладчик работает под управл. ЦП | |
| − | + | CLR @#22550 | |
| − | 161734$:MOV (SP)+,R0 ; Восстановление регистров | + | 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 | + | 161762$:MOV #-2,R3 |
| − | + | BR 161772$ | |
; Обработка команды "открыть следующую ячейку" (Вниз) | ; Обработка команды "открыть следующую ячейку" (Вниз) | ||
| − | 161770$:TST (R3)+ | + | 161770$:TST (R3)+ ; R3 = 2 |
; Обработка команды "занести значение" (Влево) | ; Обработка команды "занести значение" (Влево) | ||
| − | 161772$:TST R2 | + | 161772$:TST R2 ; Значение было введено ? |
| − | + | BEQ 162014$ ; Нет | |
| − | + | MOV R1,R0 ; R0 = введенное число | |
| − | + | MOV 22(R4),R5 ; R5 = адрес открытой ячейки | |
| − | + | ADD #2,R5 | |
| − | + | CALL 163444$ ; Занести значение в память | |
| − | 162014$:ADD R3,22(R4) ; Переход к другой ячейке | + | 162014$:ADD R3,22(R4) ; Переход к другой ячейке |
| − | 162020$:CALL 163024$ | + | 162020$:CALL 163024$ ; Прочитать ее содерж. и вывести на экран |
| − | + | RETURN | |
; Обработка команды "открыть ячейку" (Вправо) | ; Обработка команды "открыть ячейку" (Вправо) | ||
| − | 162026$:TST R2 | + | 162026$:TST R2 ; Значение было введено ? |
| − | + | BEQ 162020$ ; Нет | |
| − | + | MOV R1,22(R4) ; Изменить адрес открытой ячейки | |
| − | + | BR 162020$ | |
; Обработка команды "открыть ячейку с относительным адресом" (НР+Вниз) | ; Обработка команды "открыть ячейку с относительным адресом" (НР+Вниз) | ||
| − | 162040$:MOV #2,R3 | + | 162040$:MOV #2,R3 ; R3 = признак относительного адреса |
| − | + | BR 162050$ | |
; Обработка команды "открыть ячейку с абсолютным адресом" (НР+Вправо) | ; Обработка команды "открыть ячейку с абсолютным адресом" (НР+Вправо) | ||
| − | 162046$:CLR R3 | + | 162046$:CLR R3 ; R3 = признак абсолютного адреса |
| − | 162050$:TST R2 | + | 162050$:TST R2 ; Значение было введено ? |
| − | + | BEQ 162062$ ; Нет | |
| − | + | MOV R1,@26(R4) ; Сохр. введ. знач. в качестве адреса возврата | |
| − | + | BR 162070$ | |
| − | 162062$:MOV 22(R4),@26(R4) ; Сохр. в кач. адреса возв. адрес откр. ячейки | + | 162062$:MOV 22(R4),@26(R4) ; Сохр. в кач. адреса возв. адрес откр. ячейки |
| − | 162070$:ADD #2,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 | + | 162122$:ADD R3,R0 |
| − | + | ADD R0,22(R4) ; Адрес += содерж. откр. яч + 2 (относ. адр.) | |
| − | + | BR 162020$ | |
; Обработка команды "возврат на пред. уровень косв. адр." (НР+Вверх, НР+Влево) | ; Обработка команды "возврат на пред. уровень косв. адр." (НР+Вверх, НР+Влево) | ||
| − | 162132$:SUB #2,26(R4) ; Передвинуть назад указатель буфера сохр. | + | 162132$:SUB #2,26(R4) ; Передвинуть назад указатель буфера сохр. |
| − | + | BIS #100,26(R4) | |
| − | + | BIC #20,26(R4) | |
| − | + | MOV @26(R4),22(R4) ; Адрес = сохраненный адрес | |
| − | + | BR 162020$ | |
; Подпрограмма переключения на просмотр памяти ЦП | ; Подпрограмма переключения на просмотр памяти ЦП | ||
| − | 162164$:TST R4 | + | 162164$:TST R4 ; Пульт. отладчик работает под упр. ЦП ? |
| − | + | BMI 162202$ ; Да | |
| − | + | MOV #4,40(R4) ; Режим просмотра памяти ЦП | |
| − | + | EMT 52 ; Вывод строки "ЦМ" | |
| − | + | .WORD 107560$ | |
162202$:RETURN | 162202$:RETURN | ||
; Подпрограмма переключения на просмотр памяти ПП | ; Подпрограмма переключения на просмотр памяти ПП | ||
| − | 162204$:TST R4 | + | 162204$:TST R4 ; Пульт. отладчик работает под упр. ЦП ? |
| − | + | BMI 162220$ ; Да | |
| − | + | CLR 40(R4) ; Режим просмотра памяти ПП | |
| − | + | EMT 52 ; Вывод строки "ПМ" | |
| − | + | .WORD 107551$ | |
162220$:RETURN | 162220$:RETURN | ||
; Адреса п/п обработки клавиш с префиксом Esc для режима рег./точек останова | ; Адреса п/п обработки клавиш с префиксом Esc для режима рег./точек останова | ||
; (ИСП, Вверх, Вниз, Влево, Вправо, НР+Вверх, НР+Вниз, НР+Влево, НР+Вправо,?,?) | ; (ИСП, Вверх, Вниз, Влево, Вправо, НР+Вверх, НР+Вниз, НР+Влево, НР+Вправо,?,?) | ||
| − | 162222$:.WORD 161612$,162250$,162262$,162304$,162320$ | + | 162222$:.WORD 161612$,162250$,162262$,162304$,162320$ |
| − | + | .WORD 162342$,162334$,162342$,162326$,162164$,162204$ | |
; Обработка команды "открыть предыдущий регистр/точку останова" (Вверх) | ; Обработка команды "открыть предыдущий регистр/точку останова" (Вверх) | ||
| − | 162250$:TST R2 | + | 162250$:TST R2 ; Значение было введено ? |
| − | + | BEQ 162256$ ; Нет | |
| − | + | MOV R1,@R5 ; Занести введенное значение в рег./точку ост. | |
| − | 162256$:DEC R3 | + | 162256$:DEC R3 ; Перейти к предыдущему регистру/точке останова |
| − | + | BR 162272$ | |
; Обработка команды "открыть следующий регистр/точку останова" (Вниз) | ; Обработка команды "открыть следующий регистр/точку останова" (Вниз) | ||
| − | 162262$:TST R2 | + | 162262$:TST R2 ; Значение было введено ? |
| − | + | BEQ 162270$ ; Нет | |
| − | + | MOV R1,@R5 ; Занести введенное значение в рег./точку ост. | |
| − | 162270$:INC R3 | + | 162270$:INC R3 ; Перейти к следующему регистру/точке останова |
| − | 162272$:BIC #177770,R3 ; Подкорректировать номер рег./точки останова | + | 162272$:BIC #177770,R3 ; Подкорректировать номер рег./точки останова |
| − | + | BICB 33(R4),R3 | |
| − | + | BR 162312$ | |
; Обработка команды "занести значение в регистр/точку останова" (Влево) | ; Обработка команды "занести значение в регистр/точку останова" (Влево) | ||
| − | 162304$:TST R2 | + | 162304$:TST R2 ; Значение было введено ? |
| − | + | BEQ 162312$ ; Нет | |
| − | + | MOV R1,@R5 ; Занести введенное значение в рег./точку ост. | |
| − | 162312$:CALL 163174$ | + | 162312$:CALL 163174$ ; Вывод содержимого другого рег./точки ост. |
| − | + | RETURN | |
; Обработка команды "открыть ячейку" (Вправо) | ; Обработка команды "открыть ячейку" (Вправо) | ||
| − | 162320$:MOV #161044$,@SP ; Коррекция адреса возврата | + | 162320$:MOV #161044$,@SP ; Коррекция адреса возврата |
| − | + | BR 162026$ ; На исполнение команды | |
; Обработка команды "открыть ячейку с абсолютным адресом" (НР+Вправо) | ; Обработка команды "открыть ячейку с абсолютным адресом" (НР+Вправо) | ||
| − | 162326$:MOV #161044$,@SP ; Коррекция адреса возврата | + | 162326$:MOV #161044$,@SP ; Коррекция адреса возврата |
| − | + | BR 162046$ ; На исполнение команды | |
; Обработка команды "открыть ячейку с относительным адресом" (НР+Вниз) | ; Обработка команды "открыть ячейку с относительным адресом" (НР+Вниз) | ||
| − | 162334$:MOV #161044$,@SP ; Коррекция адреса возврата | + | 162334$:MOV #161044$,@SP ; Коррекция адреса возврата |
| − | + | BR 162040$ ; На исполнение команды | |
; Обработка команды "возврат на пред. ур. косв. адр." (НР+Вверх, НР+Влево) | ; Обработка команды "возврат на пред. ур. косв. адр." (НР+Вверх, НР+Влево) | ||
| − | 162342$:MOV #161044$,@SP ; Коррекция адреса возврата | + | 162342$:MOV #161044$,@SP ; Коррекция адреса возврата |
| − | + | BR 162132$ ; На исполнение команды | |
; Адреса подпрограмм исполнения пунктов меню ЗАГРУЗКА (не выбрано, | ; Адреса подпрограмм исполнения пунктов меню ЗАГРУЗКА (не выбрано, | ||
; диск, кассета ПЗУ, сеть, стык С2, магнитофон, отладка, тестирование) | ; диск, кассета ПЗУ, сеть, стык С2, магнитофон, отладка, тестирование) | ||
| − | 162350$:.WORD 162572$,162400$,162420$,162440$,162472$,162504$,161034$,162370$ | + | 162350$:.WORD 162572$,162400$,162420$,162440$,162472$,162504$,161034$,162370$ |
; Обработка пункта меню ЗАГРУЗКА [тестирование] | ; Обработка пункта меню ЗАГРУЗКА [тестирование] | ||
| − | 162370$:CALL 161236$ | + | 162370$:CALL 161236$ ; Перевод ЦП в режим USER |
| − | + | JMP 167540$ ; На исполнение тестов | |
; Обработка пункта меню ЗАГРУЗКА [диск] | ; Обработка пункта меню ЗАГРУЗКА [диск] | ||
| − | 162400$:MOV R0,R3 | + | 162400$:MOV R0,R3 ; R3 = номер диска (0 -- 3) |
| − | + | JSR R5,162522$ ; Перекачка загрузчика и его запуск | |
| − | + | .WORD 163774$,44,164104$,5,0 | |
; Обработка пункта меню ЗАГРУЗКА [кассета ПЗУ] | ; Обработка пункта меню ЗАГРУЗКА [кассета ПЗУ] | ||
| − | 162420$:MOV R0,R3 | + | 162420$:MOV R0,R3 ; R3 = номер кассеты ПЗУ (1 -- 2) |
| − | + | JSR R5,162522$ ; Перекачка загрузчика и его запуск | |
| − | + | .WORD 163774$,44,164116$,5,0 | |
; Обработка пункта меню ЗАГРУЗКА [сеть] | ; Обработка пункта меню ЗАГРУЗКА [сеть] | ||
| − | 162440$:JSR R4, | + | 162440$:JSR R4,163006$ ; Вывод "* ЗАГРУЗКА ИЗ СЕТИ *" |
| − | + | .WORD 163573$ ; Адрес надписи | |
| − | + | JSR R5,162522$ ; Перекачка загрузчика и его запуск | |
| − | + | .WORD 164160$,210,0 | |
; Обработка команды "Т" пультового монитора (тест локальной сети) | ; Обработка команды "Т" пультового монитора (тест локальной сети) | ||
| − | 162460$:JSR R5,162522$ ; Перекачка программы теста и ее запуск | + | 162460$:JSR R5,162522$ ; Перекачка программы теста и ее запуск |
| − | + | .WORD 164600$,360,0 | |
; Обработка пункта меню ЗАГРУЗКА [стык С2] | ; Обработка пункта меню ЗАГРУЗКА [стык С2] | ||
| − | 162472$:JSR R5,162522$ ; Перекачка загрузчика и его запуск | + | 162472$:JSR R5,162522$ ; Перекачка загрузчика и его запуск |
| − | + | .WORD 165540$,25,0 | |
; Обработка пункта меню ЗАГРУЗКА [магнитофон] | ; Обработка пункта меню ЗАГРУЗКА [магнитофон] | ||
| − | 162504$:JSR R5,162522$ ; Перекачка загрузчика и его запуск | + | 162504$:JSR R5,162522$ ; Перекачка загрузчика и его запуск |
| − | + | .WORD 163774$,44,164130$,14,0 | |
; Подпрограмма перекачки загрузчика из сист. ОЗУ и его запуск | ; Подпрограмма перекачки загрузчика из сист. ОЗУ и его запуск | ||
| − | 162522$:MOV #1000,R0 ; R0 = адрес, куда перекачивается загрузчик | + | 162522$:MOV #1000,R0 ; R0 = адрес, куда перекачивается загрузчик |
| − | 162526$:MOV (R5)+,R1 ; R1 = адрес загрузчика в сист. ОЗУ | + | 162526$:MOV (R5)+,R1 ; R1 = адрес загрузчика в сист. ОЗУ |
| − | + | BEQ 162542$ ; Конец перекачки | |
| − | + | MOV (R5)+,R2 ; R2 = размер загрузчика в словах | |
| − | 162534$:MOV (R1)+,(R0)+ ; Цикл перекачки | + | 162534$:MOV (R1)+,(R0)+ ; Цикл перекачки |
| − | + | SOB R2,162534$ | |
| − | + | BR 162526$ | |
| − | 162542$:CALL 161236$ | + | 162542$:CALL 161236$ ; Перевод ЦП в режим USER |
| − | + | MOV #200,R0 ; Копия ССП = 200 (прерывания запрещены) | |
| − | + | $MTPS$ | |
| − | + | MOV #1000,R0 ; Копия СК = 1000 (адрес загрузчика) | |
| − | + | $MTPC$ | |
| − | + | MOV #1000,SP | |
| − | + | MOV R3,R0 ; R0 = номер устройства (диска или кассеты ПЗУ) | |
| − | + | $RUN$ ; Запуск загрузчика | |
162572$:RETURN | 162572$:RETURN | ||
; Подпрограмма ввода восьмеричного значения и запроса командной клавиши | ; Подпрограмма ввода восьмеричного значения и запроса командной клавиши | ||
| − | 162574$:MOV @#172660,R4 ; R4 = начало ОЗУ пультового монитора | + | 162574$:MOV @#172660,R4 ; R4 = начало ОЗУ пультового монитора |
| − | + | BR 162604$ | |
| − | 162602$:CLR R3 | + | 162602$:CLR R3 |
| − | 162604$:MOV R4,R1 | + | 162604$:MOV R4,R1 |
| − | + | ADD #110,R1 ; R1 = адрес буфера для ввода чисел | |
| − | + | CLR R2 ; R2 = 0 (инициализация счетчика введ. цифр) | |
| − | 162614$:CALL 172614$ | + | 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 | + | 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 | + | 162706$:SUB R2,R1 ; R1 = начало буфера ввода |
| − | + | CLR R2 ; R2 = 0 (счетчик обработанных символов) | |
| − | + | CLR R5 ; R5 = 0 (введенное число (инициализация)) | |
| − | + | MOV R0,-(SP) ; Сохранить в стеке код командной клавиши | |
| − | 162716$:MOVB @R1,R0 | + | 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) | ; П/п ввода клавиши и корректировка ее кода (за символом ESC) | ||
| − | 162756$:CALL 172614$ | + | 162756$:CALL 172614$ ; Запрос нажатой клавиши |
| − | + | SUB #176,R0 ; Ее код в диапазоне 176(8) -- 207(8) ? | |
| − | + | BMI 163002$ ; Нет | |
| − | + | CMP R0,#11 | |
| − | + | BHI 163002$ ; Нет | |
| − | + | ASL R0 ; Увеличение скорректированного кода вдвое | |
| − | + | RETURN | |
| − | 163002$:CLR R0 | + | 163002$:CLR R0 ; R0 = 0 ("плохой" код) |
| − | + | RETURN | |
; Подпрограмма вывода строки на экран (адрес строки за командой JSR R4,...) | ; Подпрограмма вывода строки на экран (адрес строки за командой JSR R4,...) | ||
| − | 163006$:MOV (R4)+,R1 ; R1 = адрес строки | + | 163006$:MOV (R4)+,R1 ; R1 = адрес строки |
| − | + | BR 163016$ | |
| − | 163012$:CALL 172632$ | + | 163012$:CALL 172632$ ; Вывод символа на экран |
; Подпрограмма вывода строки на экран (адрес строки в регистре R1) | ; Подпрограмма вывода строки на экран (адрес строки в регистре R1) | ||
| − | 163016$:MOVB (R1)+,R0 ; R0 = очередной символ | + | 163016$:MOVB (R1)+,R0 ; R0 = очередной символ |
| − | + | BNE 163012$ ; Еще не конец строки | |
| − | + | RTS R4 | |
; Подпрограмма вывода на экран адреса открытой ячейки памяти и ее содержимого | ; Подпрограмма вывода на экран адреса открытой ячейки памяти и ее содержимого | ||
| − | 163024$:CALL 163370$ | + | 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) ; Сохранение значения в ОЗУ пульт. отладчика | + | 163074$:MOV R1,24(R4) ; Сохранение значения в ОЗУ пульт. отладчика |
| − | + | CLR R0 | |
| − | + | MOV #6,R2 ; Число символов в ASCII-строке | |
| − | + | BR 163122$ | |
| − | 163110$:CLR R0 | + | 163110$:CLR R0 ; Цикл вытяжки трех старших разрядов R1 -> R0 |
| − | + | ROL R1 | |
| − | + | ROL R0 | |
| − | + | ROL R1 | |
| − | + | ROL R0 | |
| − | 163122$:ROL R1 | + | 163122$:ROL R1 |
| − | + | ROL R0 | |
| − | + | ADD #'0,R0 ; Преобразование из BIN в ASCII | |
| − | + | CALL 172632$ ; Вывод символа на экран | |
| − | + | SOB R2,163110$ | |
| − | + | RETURN | |
; Подпрограмма вывода на экран регистров или точек останова | ; Подпрограмма вывода на экран регистров или точек останова | ||
| − | 163142$:CALL 163370$ | + | 163142$:CALL 163370$ ; Перевод курсора в начало следующей строки |
| − | + | CLR R3 ; R3 = 0 (начальный номер рег. или точ.ост.) | |
| − | 163150$:CALL 163200$ | + | 163150$:CALL 163200$ ; Вывод содержимого регистра или точ. ост. |
| − | + | INC R3 ; Перейти к след. регистру или точ. ост. | |
| − | + | CMPB R3,33(R4) ; Выведены все рег. или точ. ост. | |
| − | + | BLO 163150$ ; Нет | |
| − | + | CMP R3,#10 ; Номер регистра равен 10 (рег. сост. проц.) ? | |
| − | + | BEQ 163150$ ; Да | |
| − | + | RETURN | |
; Подпрограмма вывода на экран содерж. одного регистра или точки останова | ; Подпрограмма вывода на экран содерж. одного регистра или точки останова | ||
| − | 163174$:CALL 163370$ | + | 163174$:CALL 163370$ ; Перевод курсора в начало следующей строки |
| − | 163200$:MOVB 32(R4),R0 ; R0 = 'R' или 'A' (регистры или точ. ост.) | + | 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$ | + | 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 адреса хранения содержимого рег. или точ. ост. | ; Подпрограмма получения в R5 адреса хранения содержимого рег. или точ. ост. | ||
| − | 163264$:CLR 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 | + | 163306$:ADD R3,R5 ; Прибавить номер регистра или точки останова |
| − | + | ASL R5 | |
| − | + | ADD R4,R5 ; Прибавить адрес ОЗУ пультового отладчика | |
| − | + | RETURN | |
; Подпрограмма вывода на экран причины перехода процессора в режим HALT | ; Подпрограмма вывода на экран причины перехода процессора в режим HALT | ||
| − | 163316$:MOV @172662$,R2 ; R2 = адрес строки причины перехода | + | 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 | 163366$:RETURN | ||
; Подпрограмма перевода курсора в начало следующей строки | ; Подпрограмма перевода курсора в начало следующей строки | ||
| − | 163370$:MOV #15,R0 | + | 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)(только в ПП) | + | 163412$:ADD 40(R4),PC ; Режим ЦП(40(R4)=4)/ПП(40(R4)=0)(только в ПП) |
| − | + | $MFPM$ ; Чтение содержимого ячейки (R5)+ -> R0 | |
| − | + | RETURN | |
| − | 163422$:CLC | + | 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)(только в ПП) | + | 163444$:ADD 40(R4),PC ; Режим ЦП(40(R4)=4)/ПП(40(R4)=0)(только в ПП) |
| − | + | $MTPM$ ; Запись значения в ячейку памяти R0 -> -(R5) | |
| − | + | RETURN | |
| − | 163454$:CLC | + | 163454$:CLC ; Коррекция R5 для помещ. его в рег. адреса |
| − | + | ROR R5 | |
| − | + | DEC R5 | |
| − | + | MOV R5,@#177010 | |
| − | + | MOV R0,@#177014 ; Запись значения в ячейку памяти ЦП | |
| − | + | ASL R5 | |
| − | + | RETURN | |
; Esc-последовательности и надписи, употребляемые пультовым отладчиком | ; Esc-последовательности и надписи, употребляемые пультовым отладчиком | ||
| − | 163476$:.BYTE 33,275,0 ; Системный режим клавиатуры | + | 163476$:.BYTE 33,275,0 ; Системный режим клавиатуры |
| − | 163501$:.BYTE 33,277,275,0 ; Пользовательский режим клавиатуры | + | 163501$:.BYTE 33,277,275,0 ; Пользовательский режим клавиатуры |
| − | 163505$:.BYTE 33,274,0 ; Вызов меню ЗАГРУЗКА | + | 163505$:.BYTE 33,274,0 ; Вызов меню ЗАГРУЗКА |
| − | 163510$:.ASCIZ <15><12><17>/@ / | + | 163510$:.ASCIZ <15><12><17>/@ / |
| − | 163516$:.ASCIZ "/ " | + | 163516$:.ASCIZ "/ " |
| − | 163521$:.ASCIZ /R/ | + | 163521$:.ASCIZ /R/ |
| − | 163523$:.ASCIZ /RS/ | + | 163523$:.ASCIZ /RS/ |
| − | 163526$:.ASCIZ /=/ | + | 163526$:.ASCIZ /=/ |
| − | 163530$:.ASCIZ <15><12><16>/*** / | + | 163530$:.ASCIZ <15><12><16>/*** / |
| − | 163540$:.ASCIZ / ***/<17> | + | 163540$:.ASCIZ / ***/<17> |
| − | 163546$:.ASCIZ <15><12> | + | 163546$:.ASCIZ <15><12> |
| − | 163551$:.ASCIZ <33>/D /<33>/D/ | + | 163551$:.ASCIZ <33>/D /<33>/D/ |
| − | + | .EVEN | |
| − | 163560$:.ASCIZ / | + | 163560$:.ASCII / / |
| − | 163563$:.ASCIZ <6>/ЦП/ | + | 163561$:.ASCIZ / / |
| − | 163567$:.ASCIZ <6>/ПП/ | + | 163563$:.ASCIZ <6>/ЦП/ |
| − | 163573$:.ASCIZ <15><12><12><16>/* zagruzka iz seti * /<17> | + | 163567$:.ASCIZ <6>/ПП/ |
| − | 163627$:.ASCIZ /zawisanie/ | + | 163573$:.ASCIZ <15><12><12><16>/* zagruzka iz seti * /<17> |
| − | 163641$:.ASCIZ /rezerwnyj kod/ | + | 163627$:.ASCIZ /zawisanie/ |
| − | 163657$:.ASCIZ /awariq setewogo pitaniq/ | + | 163641$:.ASCIZ /rezerwnyj kod/ |
| − | 163707$:.ASCIZ /dwojnoe zawisanie/ | + | 163657$:.ASCIZ /awariq setewogo pitaniq/ |
| − | 163731$:.ASCIZ /stop/ | + | 163707$:.ASCIZ /dwojnoe zawisanie/ |
| − | 163736$:.ASCIZ /zawisanie pri prieme a.w.p./ | + | 163731$:.ASCIZ /stop/ |
| − | + | 163736$:.ASCIZ /zawisanie pri prieme a.w.p./ | |
| − | 163772$:.WORD 0 | + | .EVEN |
| + | 163772$:.WORD 0 | ||
; Загрузчик с диска, кассеты ПЗУ, магнитофона | ; Загрузчик с диска, кассеты ПЗУ, магнитофона | ||
| − | 163774$:MOV #176674,R1 ; R1 = адрес регистра сост. перед. канала 2 | + | 163774$:MOV #176674,R1 ; R1 = адрес регистра сост. перед. канала 2 |
| − | + | MOVB R0,164104$+3 ; Сохранить номер устройства | |
| − | + | CLRB @R1 ; Запретить прерывания от канала 2 | |
| − | + | MOV #164104$-163774$+1000,R2 ; R2 = адрес блока параметров | |
| − | 164012$:MOV #2,R3 | + | 164012$:MOV #2,R3 |
| − | 164016$:TSTB @R1 | + | 164016$:TSTB @R1 ; Ожидание готовности канала 2 |
| − | + | BPL 164016$ ; Не готов | |
| − | + | MOVB R2,2(R1) ; Передача адреса БП в канал 2 | |
| − | + | SWAB R2 | |
| − | + | SOB R3,164016$ | |
| − | + | MOV #2,R3 | |
| − | 164036$:TSTB @R1 | + | 164036$:TSTB @R1 ; Ожидание готовности канала 2 |
| − | + | BPL 164036$ ; Не готов | |
| − | + | MOVB #377,2(R1) ; Передача байтов завершения в канал 2 | |
| − | + | SOB R3,164036$ | |
| − | 164052$:TSTB @R1 | + | 164052$:TSTB @R1 ; Ожидание завершения операции |
| − | + | BPL 164052$ ; Операция не завершена | |
| − | + | TSTB 164104$ ; Есть ошибки ? | |
| − | + | BEQ 164072$ ; Нет | |
| − | + | CLRB 164104$ ; Очистить байт ошибок | |
| − | + | BR 164012$ ; Попробовать заново | |
| − | 164072$:CMP #240,@#0 ; Первая команда BOOT-сектора NOP ? | + | 164072$:CMP #240,@#0 ; Первая команда BOOT-сектора NOP ? |
| − | + | BNE 164012$ ; Нет | |
| − | + | CLR PC ; Запуск BOOT | |
; Блок параметров для диска | ; Блок параметров для диска | ||
| − | 164104$:.BYTE 0,10,2,0,0,1 | + | 164104$:.BYTE 0,10,2,0,0,1 |
| − | + | .WORD 0,400 | |
; Блок параметров для кассеты ПЗУ | ; Блок параметров для кассеты ПЗУ | ||
| − | 164116$:.BYTE 0,10,21,0,0,0 | + | 164116$:.BYTE 0,10,21,0,0,0 |
| − | + | .WORD 0,400 | |
; Блок параметров для магнитофона | ; Блок параметров для магнитофона | ||
| − | 164130$:.BYTE 0,11,11,0 | + | 164130$:.BYTE 0,11,11,0 |
| − | + | .WORD 0,0,0,0,0,0,0,0,0,400 | |
; Загрузчик из сети | ; Загрузчик из сети | ||
| − | 164160$:MTPS #340 | + | 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 ; Установка указателя стека | + | 164244$:MOV #10000,SP ; Установка указателя стека |
| − | + | MOV #164526$-164160$+1000,@#100 ; Устан. вект. прер. сет. таймера | |
| − | + | CLR @#102 | |
| − | + | MTPS #0 ; Разрешить прерывания | |
| − | + | CLR 164534$ ; Очистка счетчика ожидания | |
| − | 164272$:TRAP 0 | + | 164272$:TRAP 0 ; Чтение пришедшего байта |
| − | + | CMP 164534$,#5 ; Счетчик ожидания больше пяти | |
| − | + | BLO 164272$ ; Нет | |
| − | 164304$:EMT 0 | + | 164304$:EMT 0 ; Посылка и чтение очередного байта |
| − | + | CMPB #376,R0 ; Пришедший байт равен 376(8) | |
| − | + | BNE 164304$ ; Нет | |
| − | + | MOV #164554$-164160$+1000,R1 ; R1 = адрес блока передачи | |
| − | 164320$:MOVB (R1)+,R0 ; R0 = очередной байт из блока передачи | + | 164320$:MOVB (R1)+,R0 ; R0 = очередной байт из блока передачи |
| − | + | CMPB #376,R0 ; Он равен 376(8) ? | |
| − | + | BEQ 164334$ ; Да | |
| − | + | EMT 0 ; Посылка и чтение очередного байта | |
| − | + | BR 164320$ | |
| − | 164334$:EMT 0 | + | 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 | + | 164372$:EMT 0 ; Посылка и чтение очередного байта |
| − | + | CMPB #373,R0 ; Считанный байт равен 373(8) ? | |
| − | + | BLOS 164410$ ; Выше или равен 373(8) | |
| − | + | XOR R0,R4 ; Подсчет контрольной суммы | |
| − | + | MOVB R0,(R1)+ ; Передача принятого байта в память | |
| − | + | BR 164372$ | |
| − | 164410$:BNE 164426$ | + | 164410$:BNE 164426$ ; Принятый байт равен не равен 373(8) |
| − | + | EMT 0 ; Посылка и чтение очередного байта | |
| − | + | COM R0 ; Инверсия принятого байта | |
| − | + | XOR R0,R4 ; Подсчет контрольной суммы | |
| − | + | MOVB R0,(R1)+ ; Передача принятого байта в память | |
| − | + | COM R0 ; Инверсия для передачи | |
| − | + | BR 164372$ | |
| − | 164426$:CMPB #374,R0 | + | 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) | ; Подпрограмма передачи байта в локальную сеть (исполнение команды EMT) | ||
| − | 164500$:TSTB @#176564 ; Передатчик СА готов ? | + | 164500$:TSTB @#176564 ; Передатчик СА готов ? |
| − | + | BPL 164500$ ; Нет | |
| − | + | MOVB R0,@#176566 ; Передача байта в сеть | |
; Подпрограмма чтения байта, пришедшего по сети (исполнение команды TRAP) | ; Подпрограмма чтения байта, пришедшего по сети (исполнение команды TRAP) | ||
| − | 164512$:TSTB @#176560 ; Приемник СА готов ? | + | 164512$:TSTB @#176560 ; Приемник СА готов ? |
| − | + | BPL 164512$ ; Нет | |
| − | + | MOVB @#176562,R0 ; Прием байта из сети | |
| − | + | RTI | |
; Подпрограмма исполнения прерываний таймера | ; Подпрограмма исполнения прерываний таймера | ||
| − | 164526$:CLR @#176560 ; Включение режима загрузки | + | 164526$:CLR @#176560 ; Включение режима загрузки |
| − | + | INC (PC)+ ; Инкремент счетчика ожидания | |
| − | 164534$:.WORD 0 | + | 164534$:.WORD 0 |
| − | + | CMP 164534$,#1000 ; Счетчик ожидания превысил лимит времени ? | |
| − | + | BHI 164550$ ; Да | |
| − | + | RTI | |
| − | 164550$:JMP 164244$ | + | 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 | + | 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 | + | 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 | + | 164662$:.WORD 0 |
| − | + | CALL 165304$ ; Вывести номер сетевой станции | |
| − | + | MTPS #0 ; Разрешить прерывания | |
| − | 164674$:TSTB @#177560 ; Нажата клавиша ? | + | 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$ | + | 164726$:TST 164662$ ; Режим активный или пассивный ? |
| − | + | BEQ 164674$ ; Пассивный режим | |
| − | + | MOVB R0,R1 ; R1 = код нажатой клавиши | |
| − | + | CALL 165104$ ; Посылка в сеть | |
| − | + | BR 164674$ | |
; Подпрограмма запроса команды и ее исполнение | ; Подпрограмма запроса команды и ее исполнение | ||
| − | 164744$:TSTB @#177564 | + | 164744$:TSTB @#177564 ; Готовность перед. канала 0 (терминал) |
| − | + | BPL 164744$ ; Не готов | |
| − | + | MOVB #'?,@#177566 ; Вывести промптер '?' | |
| − | 164760$:TSTB @#177560 ; Нажата клавиша ? | + | 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$ ; Установить признак активного режима | + | 165046$:MOV #1,164662$ ; Установить признак активного режима |
| − | + | BR 165102$ | |
; Пассивный режим | ; Пассивный режим | ||
| − | 165056$:CLR 164662$ | + | 165056$:CLR 164662$ ; Установить признак пассивного режима |
| − | + | BR 165102$ | |
; Конец теста | ; Конец теста | ||
| − | 165064$:MOV #165504$-164600$+1000,R5 ; Адрес строки "КОНЕЦ ТЕСТА" | + | 165064$:MOV #165504$-164600$+1000,R5 ; Адрес строки "КОНЕЦ ТЕСТА" |
| − | + | CALL 165402$ ; Вывести на экран | |
| − | + | HALT ; Выход в пультовый отладчик | |
; Номер станции | ; Номер станции | ||
| − | 165076$:CALL 165304$ | + | 165076$:CALL 165304$ ; Вывести номер станции на экран |
165102$:RETURN | 165102$:RETURN | ||
; Подпрограмма передачи данных в сеть | ; Подпрограмма передачи данных в сеть | ||
| − | 165104$:TSTB @#176564 ; Передатчик готов ? | + | 165104$:TSTB @#176564 ; Передатчик готов ? |
| − | + | BPL 165104$ ; Нет | |
| − | + | MOVB R1,@#176566 ; Послать байт в сеть | |
| − | + | RETURN | |
; Подпрограмма обработки событий сетевого таймера | ; Подпрограмма обработки событий сетевого таймера | ||
| − | 165120$:MOV #100,@#176560 ; Установить режим прерываний СА | + | 165120$:MOV #100,@#176560 ; Установить режим прерываний СА |
| − | + | RTI | |
; Подпрограмма обработки прерываний от СА | ; Подпрограмма обработки прерываний от СА | ||
| − | 165130$:MOV R1,-(SP) | + | 165130$:MOV R1,-(SP) |
| − | + | BIT #110001,@#176560 ; Есть ошибки передачи ? | |
| − | + | BNE 165176$ ; Да | |
| − | + | MOVB @#176562,R1 ; R1 = принятые данные | |
| − | 165146$:TSTB @#177564 ; Готовность терминала | + | 165146$:TSTB @#177564 ; Готовность терминала |
| − | + | BPL 165146$ ; Не готов | |
| − | + | MOVB R1,@#177566 ; Вывести принятый символ на экран | |
| − | + | TST 164662$ ; Активный/пассивный режим | |
| − | + | BNE 165172$ ; Активный | |
| − | + | CALL 165104$ ; Послать данные в сеть | |
| − | 165172$:MOV (SP)+,R1 | + | 165172$:MOV (SP)+,R1 |
| − | + | RTI | |
| − | 165176$:MOV @#176560,R1 ; R1 = регистр состояния приемника СА | + | 165176$:MOV @#176560,R1 ; R1 = регистр состояния приемника СА |
| − | + | BPL 165210$ ; Ошибка паритета отсутствует | |
| − | + | BIS #4,R1 ; Установить признак ошибки паритета | |
| − | 165210$:BIT #10000,R1 ; Есть ошибки переполнения ? | + | 165210$:BIT #10000,R1 ; Есть ошибки переполнения ? |
| − | + | BEQ 165222$ ; Нет | |
| − | + | BIS #2,R1 ; Установить признак переполнения | |
| − | 165222$:BIC #177770,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 (ошибка обращения к каналу) | ; Подпрограмма обработки прерывания 4 (ошибка обращения к каналу) | ||
| − | 165254$:MOV #"04, | + | 165254$:MOV #"04,165461$+15 ; Номер прерывания в сообщение |
| − | + | BR 165272$ | |
; Подпрограмма обработки прерывания 10 (зарезервированная инструкция) | ; Подпрограмма обработки прерывания 10 (зарезервированная инструкция) | ||
| − | 165264$:MOV #"10, | + | 165264$:MOV #"10,165461$+15 ; Номер прерывания в сообщение |
| − | 165272$:MOV #165461$-164600$+1000,R5 ; Адрес сообщения "ПРЕРЫВАНИЕ #XX" | + | 165272$:MOV #165461$-164600$+1000,R5 ; Адрес сообщения "ПРЕРЫВАНИЕ #XX" |
| − | + | CALL 165402$ ; Вывести сообщение на экран | |
| − | + | HALT ; Переход в режим пультового отладчика | |
; Подпрограмма вывода на экран номера сетевой станции | ; Подпрограмма вывода на экран номера сетевой станции | ||
| − | 165304$:MOVB @#176561,R0 ; Выделение номера станции, перевод | + | 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 ; Готовность к принятию символа | + | 165402$:TSTB @#177564 ; Готовность к принятию символа |
| − | + | BPL 165402$ ; Не готов | |
| − | + | MOVB (R5)+,@#177566 ; Вывести очередной символ на экран | |
| − | + | BNE 165402$ ; Еще не конец строки | |
| − | + | RETURN | |
| − | 165420$:.ASCIZ <16>/sboj #0/<17><15><12> | + | 165420$:.ASCIZ <16>/sboj #0/<17><15><12> |
| − | 165434$:.ASCIZ <16>/test stancii #00/<17><15><12> | + | 165434$:.ASCIZ <16>/test stancii #00/<17><15><12> |
| − | 165461$:.ASCIZ <16>/prerywanie #00/<17><15><12> | + | 165461$:.ASCIZ <16>/prerywanie #00/<17><15><12> |
| − | 165504$:.ASCIZ <16>/konec testa/<17><15><12> | + | 165504$:.ASCIZ <16>/konec testa/<17><15><12> |
| − | + | .EVEN | |
| − | 165524$:.WORD 0,0,0,0,0,0 | + | 165524$:.WORD 0,0,0,0,0,0 |
; Загрузчик из стыка С2 | ; Загрузчик из стыка С2 | ||
| − | 165540$:TSTB @#176574 ; Проверка готовности передатчика | + | 165540$:TSTB @#176574 ; Проверка готовности передатчика |
| − | + | BPL 165540$ ; Не готов | |
| − | + | MOV #100,@#176576 ; Послать код 100(8) (готовность к обмену) | |
| − | + | CLR R1 ; R1 = 0 (адрес считывания BOOT) | |
| − | + | MOV #1000,R2 ; R2 = 1000 (размер BOOT) | |
| − | 165562$:TSTB @#176570 ; Приемник готов ? | + | 165562$:TSTB @#176570 ; Приемник готов ? |
| − | + | BPL 165562$ ; Нет | |
| − | + | MOVB @#176572,(R1)+ ; Переслать принятый байт в память | |
| − | + | SOB R2,165562$ | |
| − | + | CMP @#0,#240 ; Первая команда BOOT равна NOP ? | |
| − | + | BEQ 165610$ ; Да | |
| − | + | HALT ; Переход в режим пультового отладчика | |
| − | 165610$:CLR PC | + | 165610$:CLR PC ; Переход к исполнению BOOT |
; Обработка команд FIS (FADD, FSUB, FMUL, FDIV) | ; Обработка команд FIS (FADD, FSUB, FMUL, FDIV) | ||
| − | 165612$:MOV R2,@167502$ ; Сохранить R2 | + | 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 | + | 165772$:ADD #166112$-165772$,R1 |
| − | + | ADD @R1,R1 | |
| − | + | JMP @R1 | |
| − | 166002$:MOV #4,R5 | + | 166002$:MOV #4,R5 ; R5 = адрес вектора по ош. обр. к каналу |
| − | 166006$:$MFPM$ | + | 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) | ; Смещения подпрограмм исполнения действий с ПЗ (FADD, FSUB, FMUL, FDIV) | ||
| − | 166112$:.WORD 166624$-166112$,166620$-166112$ | + | 166112$:.WORD 166624$-166112$,166620$-166112$ |
| − | + | .WORD 166122$-166112$,166416$-166112$ | |
; Подпрограмма эмуляции команды FMUL | ; Подпрограмма эмуляции команды FMUL | ||
| − | 166122$:BIT #77600,R2 ; Порядок B = 0 ? | + | 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 | + | 166152$:TST R4 |
| − | + | BPL 166162$ ; A >= 0 | |
| − | + | INC 26(R1) ; Аргумент A отрицательный | |
| − | 166162$:MOV R4,R1 | + | 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-РАЗРЯДНЫХ ЧИСЕЛ ! | ||
| Line 1,083: | Line 1,094: | ||
; ! Далее реализуется хорошо известный принцип столбика: ! | ; ! Далее реализуется хорошо известный принцип столбика: ! | ||
; ! ! | ; ! ! | ||
| − | ; ! | + | ; ! c d ! |
| − | ; ! | + | ; ! a b ! |
; ! ------- ! | ; ! ------- ! | ||
; ! bd ! | ; ! bd ! | ||
| − | ; ! | + | ; ! bc ! |
| − | ; ! | + | ; ! ad ! |
; ! ac ! | ; ! 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 | + | 166260$:MUL R5,R2 ; (R2,R3) = bc |
| − | 166262$:MOV 167502$,R0 ; R0 = адрес буфера сохранения | + | 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 | + | 166312$:MUL R4,R0 ; (R0,R1) = ad |
| − | + | ASR R4 ; Приведение a к нормальному виду | |
| − | 166316$:ADD R1,R3 | + | 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 | + | 166406$:CLR R2 ; (R2,R3) = 0.0 |
| − | + | CLR R3 | |
| − | + | JMP 167306$ | |
; Подпрограмма эмуляции команды FDIV | ; Подпрограмма эмуляции команды FDIV | ||
| − | 166416$:BIT #77600,R2 ; B = 0 (деление на нуль) ? | + | 166416$:BIT #77600,R2 ; B = 0 (деление на нуль) ? |
| − | + | BNE 166432$ ; Нет | |
| − | + | CLR R5 ; Слово ошибок = 0 | |
| − | 166426$:JMP 167330$ | + | 166426$:JMP 167330$ ; Деление на нуль |
| − | 166432$:BIT #77600,R4 ; A = 0 (нуль / ... = нуль) ? | + | 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 | + | 166454$:TST R4 |
| − | + | BPL 166464$ ; A >= 0 | |
| − | + | INC 26(R1) ; Аргумент A отрицательный | |
| − | 166464$:MOV R4,R1 | + | 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-РАЗРЯДНЫХ ЧИСЕЛ ! | ; ! ПРИНЦИП ДЕЛЕНИЯ ДВУХ 32-РАЗРЯДНЫХ ЧИСЕЛ ! | ||
| Line 1,181: | Line 1,192: | ||
; ! результат[31] := 0 ! | ; ! результат[31] := 0 ! | ||
; \-------------------------------------------------------------------------/ | ; \-------------------------------------------------------------------------/ | ||
| − | + | MOV #40,R1 ; Бит признака конца операции | |
| − | + | CLR R0 | |
| − | 166536$:CMP R4,#200 | + | 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 | + | 166560$:ADD R3,R5 ; (R4,R5) = (R4,R5) + (R2,R3) (восстановление |
| − | + | ADC R4 ; мантиссы A) | |
| − | + | ADD R2,R4 | |
| − | + | 166566$:CLC ; Сбросить бит C (+ 0 для результата) | |
| − | 166570$:ROL R1 | + | 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 | ; Подпрограмма эмуляции команды FSUB | ||
| − | 166620$:ADD #100000,R2 ; B := (-B) | + | 166620$:ADD #100000,R2 ; B := (-B) |
; Подпрограмма эмуляции команды FADD | ; Подпрограмма эмуляции команды FADD | ||
| − | 166624$:BIT #77600,R2 ; Аргумент B = 0 ? | + | 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 | + | 166650$:MOV R4,R2 ; Результат := A (B = 0) |
| − | + | MOV R5,R3 | |
| − | 166654$:JMP 167306$ | + | 166654$:JMP 167306$ |
| − | 166660$:BIT #77600,R4 ; Аргумент A = 0 ? | + | 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 | + | 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 | + | 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$ | + | 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 | + | 167006$:ASL R0 ; Перенос порядка в младшие разряды |
| − | + | SWAB R0 | |
| − | + | NEG R0 ; Изменение знака для осущ. сдвига вправо | |
| − | + | INCB R0 ; +1 (далее для отлавл. двух выдвин. разр.) | |
| − | + | BEQ 167024$ | |
| − | + | ASHC R0,R4 ; Сдвинуть мантиссу A вправо | |
| − | + | ROR R1 ; Запомнить последний разряд | |
| − | 167024$:ASHC # | + | 167024$:ASHC #77,R4 ; Сдвинуть мантиссу A на 1 разряд вправо |
| − | + | ROR R1 ; Запомнить предпоследний разряд | |
| − | + | BR 167074$ | |
| − | 167034$:CLR R1 | + | 167034$:CLR R1 ; Последние разряды равны нулю |
| − | + | CMP R0,#172000 ; Разность порядков больше -24 | |
| − | + | BGE 167052$ ; Нет | |
| − | + | CLR R2 ; Мантисса B равна нулю | |
| − | + | CLR R3 | |
| − | + | BR 167074$ | |
| − | 167052$:ASL R0 | + | 167052$:ASL R0 ; Перенос порядка в младшие разряды |
| − | + | SWAB R0 | |
| − | + | INCB R0 ; +1 (для отлавливания 2 выдвинутых разрядов) | |
| − | + | BEQ 167066$ | |
| − | + | ASHC R0,R2 ; Сдвинуть мантиссу B вправо | |
| − | + | ROR R1 ; Запомнить последний разряд | |
| − | 167066$:ASHC # | + | 167066$:ASHC #77,R2 ; Сдвинуть мантиссу B на 1 разряд вправо |
| − | + | ROR R1 ; Запомнить предпоследний разряд | |
| − | 167074$:ADD R5,R3 | + | 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 | + | 167130$:MOV R3,R4 ; Проверка на нул. мантиссу (отсюда рез. 0) |
| − | + | BIS R1,R4 | |
| − | + | BIS R2,R4 | |
| − | + | BEQ 167306$ ; Мантисса нулевая | |
| − | 167140$:CMP R2,#400 | + | 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 | + | 167164$:CMP R2,#200 ; Мантисса < 0.5 ? |
| − | + | BHIS 167210$ ; Нет | |
| − | + | ASL R1 ; Сдвиг мантиссы влево на 1 разряд | |
| − | + | ROL R3 | |
| − | + | ROL R2 | |
| − | + | SUB #200,@167502$ ; Порядок := порядок - 1 | |
| − | + | BR 167164$ | |
| − | 167210$:ROL R1 | + | 167210$:ROL R1 ; Бит C := предпоследний разряд |
| − | + | ADC R3 ; Прибавить предпоследний разряд (округление) | |
| − | + | ADC R2 | |
| − | 167216$:CMP R2,#400 | + | 167216$:CMP R2,#400 ; Мантисса >= 1.0 |
| − | + | BLO 167242$ ; Нет | |
| − | + | ROR R2 ; Сдвиг мантиссы вправо на 1 разряд | |
| − | + | ROR R3 | |
| − | + | ROR R1 | |
| − | + | ADD #200,@167502$ ; Порядок := порядок + 1 | |
| − | + | BR 167216$ | |
| − | 167242$:CLR R5 | + | 167242$:CLR R5 ; Регистр признаков = 0 |
| − | + | MOV @167502$,R4 ; R4 = порядок | |
| − | + | BEQ 167334$ ; Порядок равен нулю (исчезновение порядка) | |
| − | + | BPL 167262$ ; Положительный порядок | |
| − | + | ROL R4 | |
| − | + | BPL 167340$ ; Переполнение порядка | |
| − | + | BR 167334$ ; Исчезновение порядка | |
| − | 167262$:MOV 167502$,R0 ; R0 = адрес буфера сохранения | + | 167262$:MOV 167502$,R0 ; R0 = адрес буфера сохранения |
| − | + | ROR 26(R0) ; Результат отрицательный ? | |
| − | + | BCC 167300$ ; Нет | |
| − | + | BIS #100000,R2 ; Установка знакового разряда | |
| − | 167300$:BIC #200,R2 | + | 167300$:BIC #200,R2 ; Сброс скрытого бита |
| − | + | BIS R4,R2 ; Установить поле порядка | |
| − | + | 167306$:CLR R5 ; Регистр признаков = 0 | |
| − | + | TST R2 ; Установить ССП | |
| − | + | BNE 167320$ ; Результат не равен нулю | |
| − | + | BIS #4,R5 ; Установить бит Z | |
| − | 167320$:BPL 167350$ | + | 167320$:BPL 167350$ ; Результат больше нуля |
| − | + | BIS #10,R5 ; Установить бит N | |
| − | + | BR 167350$ | |
| − | 167330$:BIS #1,R5 | + | 167330$:BIS #1,R5 ; R5 = 13 (деление на нуль) |
| − | 167334$:BIS #10,R5 | + | 167334$:BIS #10,R5 ; R5 = 12 (исчезновение порядка) |
| − | 167340$:BIS #2,R5 | + | 167340$:BIS #2,R5 ; R5 = 2 (переполнение порядка) |
| − | + | BIS #100000,R5 ; Признак регистра ошибок | |
| − | 167350$:MOV 167502$,R0 ; R0 = адрес буфера сохранения | + | 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( | + | 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$ | + | 167500$:$RUN$ ; Продолжить программу |
| − | 167502$:.WORD 167504$ | + | 167502$:.WORD 167504$ ; Адрес буфера сохранения |
; Буфер сохранения (текущий порядок,R0,R1,R2,R3,R4,R5,SP,PC,PS,указатель на | ; Буфер сохранения (текущий порядок,R0,R1,R2,R3,R4,R5,SP,PC,PS,указатель на | ||
; поле регистра из инструкции FP,знак результата,2 слова для промежуточного | ; поле регистра из инструкции FP,знак результата,2 слова для промежуточного | ||
; хранения мантиссы) | ; хранения мантиссы) | ||
| − | 167504$:.BLKW 16 | + | 167504$:.BLKW 16 |
; Подпрограмма исполнения пункта меню ЗАГРУЗКА [тестирование] | ; Подпрограмма исполнения пункта меню ЗАГРУЗКА [тестирование] | ||
| − | 167540$:CLR @#177656 ; Номер прохода | + | 167540$:CLR @#177656 ; Номер прохода |
| − | + | CLR @#177654 ; Число ошибок | |
| − | + | MOV #177700,R1 ; R1 = адрес буфера регистрации ошибок | |
| − | + | MOV #10,R2 ; Размер буфера | |
| − | 167560$:CLR (R1)+ | + | 167560$:CLR (R1)+ ; Цикл очистки буфера |
| − | + | SOB R2,167560$ | |
| − | + | JSR R4,163006$ ; Вывод заголовка на экран | |
| − | + | .WORD 170116$ | |
167572$:CLV | 167572$:CLV | ||
| − | + | INC @#177656 ; Увеличить номер прохода | |
| − | + | BVC 167610$ ; Нет переполнения | |
| − | + | MOV #-1,@#177656 ; Номер прохода равен 65535 | |
| − | 167610$:JSR R4,163006$ ; Вывод надписи "ПРОХОД:" | + | 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 | + | 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$ | + | 167742$:CALL 172614$ ; Ожид. симв. с кодом 177(8)(ПП кончил тест) |
| − | + | CLR @#177654 ; Общее число ошибок = 0 | |
| − | + | MOV #177700,R1 ; R1 = адрес буфера регистрации ошибок | |
| − | + | MOV #10,R2 ; R2 = размер буфера | |
| − | + | CLV | |
| − | 167764$:ADD (R1)+,@#177654 ; Цикл получения общей суммы | + | 167764$:ADD (R1)+,@#177654 ; Цикл получения общей суммы |
| − | + | BVC 170002$ ; Нет переполнения | |
| − | + | MOV #-1,@#177654 ; Общее число ошибок = 65535 | |
| − | + | BR 170004$ | |
| − | 170002$:SOB R2,167764$ | + | 170002$:SOB R2,167764$ |
| − | 170004$:JSR R4,163006$ ; Вывод надписи "ОШИБОК:" | + | 170004$:JSR R4,163006$ ; Вывод надписи "ОШИБОК:" |
| − | + | .WORD 170204$ | |
| − | + | MOV @#177654,R3 ; R3 = число ошибок | |
| − | + | CALL 170032$ ; Перевод числа ошибок в строку символов | |
| − | + | JSR R4,163006$ ; Вывод числа ошибок на экран | |
| − | + | .WORD 177660 | |
| − | + | BR 167572$ | |
; Подпрограмма перевода 16-разрядного числа в его ASCII-представление | ; Подпрограмма перевода 16-разрядного числа в его ASCII-представление | ||
| − | 170032$:MOV #177660 | + | 170032$:MOV #177660,R0 ; R0 = адрес буфера приема символов |
| − | + | MOV #6,R2 ; R2 = размер буфера | |
| − | 170042$:MOVB #40,(R0)+ ; Инициализация буфера (заполнение пробелами) | + | 170042$:MOVB #40,(R0)+ ; Инициализация буфера (заполнение пробелами) |
| − | + | SOB R2,170042$ | |
| − | + | CLRB @R0 ; Отметить конец буфера | |
| − | 170052$:CLR -(SP) | + | 170052$:CLR -(SP) ; Остаток от деления равен 0 (инициализация) |
| − | + | MOV #16.,R1 ; R1 = число разрядов | |
| − | 170060$:ASL R3 | + | 170060$:ASL R3 ; Цикл дел. на 10, частное в R3, остаток в @SP |
| − | + | ROL @SP | |
| − | + | CMP @SP,#10. | |
| − | + | BMI 170100$ | |
| − | + | SUB #10.,@SP | |
| − | + | INC R3 | |
| − | 170100$:SOB R1,170060$ | + | 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 | + | 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> | + | 170165$:.ASCIZ <33>/Y(5/<16>/prohod: /<17> |
| − | 170204$:.ASCIZ <16>/ o{ibok: /<17> | + | 170204$:.ASCIZ <16>/ o{ibok: /<17> |
| − | + | .EVEN | |
; Подпрограмма тестирования оперативного запоминающего устройства | ; Подпрограмма тестирования оперативного запоминающего устройства | ||
| − | 170224$:MOV R4,R1 | + | 170224$:MOV R4,R1 ; R1 = начальный адрес ОЗУ |
| − | + | CLR R3 | |
| − | 170230$:MOV R1,R0 | + | 170230$:MOV R1,R0 ; R0 = текущий адрес |
| − | + | TST R3 ; Прямой адрес(0), инверсный адрес(<>0) | |
| − | + | BEQ 170240$ | |
| − | + | COM R0 | |
| − | 170240$:MOV R0,(R1)+ ; Записать в ячейку ее адрес(прям. или инв.) | + | 170240$:MOV R0,(R1)+ ; Записать в ячейку ее адрес(прям. или инв.) |
| − | + | CMP R1,R5 ; Достигли конца ? | |
| − | + | BLO 170230$ ; Нет | |
| − | + | 170246$:CMP R0,-(R1) ; Содержимое ячейки равно ее адресу | |
| − | + | BEQ 170260$ ; Да | |
| − | + | MOV #1,R0 ; Ошибка | |
| − | + | RETURN | |
| − | 170260$:MOV R1,R0 | + | 170260$:MOV R1,R0 ; R0 = текущий адрес |
| − | + | SUB #2,R0 ; На одну ячейку назад | |
| − | + | TST R3 ; Прямой или инверсный адрес ? | |
| − | + | BEQ 170274$ ; Прямой | |
| − | + | COM R0 | |
| − | 170274$:CMP R1,R4 | + | 170274$:CMP R1,R4 ; Достигли начала ? |
| − | + | BHI 170246$ ; Нет | |
| − | + | COM R3 ; Перейти на инверсный адрес | |
| − | + | BNE 170230$ ; Произвести тест с инверсным адресом | |
| − | + | MOV #377,-12(SP) ; Будет заполняться младший байт | |
| − | + | MOV R4,R3 ; R3 = начальный адрес | |
| − | 170314$:CLR -6(SP) | + | 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) ; Текущий адрес | + | 170342$:MOV R3,-14(SP) ; Текущий адрес |
| − | + | MOV -10(SP),R1 ; R1 = начальный адрес | |
| − | 170352$:MOV -12(SP),R0 ; R0 = образец заполнения | + | 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) ; Делать запись | + | 170370$:BITB #1,-6(SP) ; Делать запись |
| − | + | BNE 170402$ ; Нет | |
| − | + | MOV R0,@R1 ; Записать в ячейку | |
| − | 170402$:CMP R0,@R1 | + | 170402$:CMP R0,@R1 ; Совпадает ? |
| − | + | BEQ 170414$ ; Да | |
| − | + | MOV #3,R0 ; Ошибка | |
| − | + | RETURN | |
| − | 170414$:ADD #2,R1 | + | 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 = текущий адрес | + | 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 | + | 170506$:MOV R4,R1 ; R1 = начальный адрес |
| − | + | MOV -12(SP),R0 ; R0 = образец заполнения | |
| − | 170514$:MOV R0,(R1)+ ; Записать в ячейку | + | 170514$:MOV R0,(R1)+ ; Записать в ячейку |
| − | + | CMP R1,R5 ; Достигнут конец ? | |
| − | + | BLO 170514$ ; Нет | |
| − | + | MOV R4,R1 ; R1 = начальный адрес | |
| − | 170524$:CMP R0,@R1 | + | 170524$:CMP R0,@R1 ; Сравнить содержимое ячейки с образцом |
| − | + | BEQ 170536$ ; Равно | |
| − | + | MOV #2,R0 ; Ошибка | |
| − | + | RETURN | |
| − | 170536$:ADD #2,R1 | + | 170536$:ADD #2,R1 ; Перейти к следующей ячейке |
| − | + | CMP R1,R5 ; Достигнут конец ? | |
| − | + | BLO 170524$ ; Нет | |
| − | + | CALL 170614$ ; Задержка | |
| − | + | MOV -12(SP),R0 ; R0 = образец заполнения | |
| − | + | MOV R4,R1 ; R1 = начальный адрес | |
| − | 170560$:CMP R0,@R1 | + | 170560$:CMP R0,@R1 ; Сравнить содержимое ячейки с образцом |
| − | + | BEQ 170572$ ; Равно | |
| − | + | MOV #3,R0 ; Ошибка | |
| − | + | RETURN | |
| − | 170572$:ADD #2,R1 | + | 170572$:ADD #2,R1 ; Перейти к следующей ячейке |
| − | + | CMP R1,R5 ; Достигнут конец ? | |
| − | + | BLO 170560$ ; Нет | |
| − | + | SWAB -12(SP) ; Обменять байты образца | |
| − | + | BEQ 170506$ ; На второй проход | |
| − | + | CLR R0 ; Нет ошибок | |
| − | + | RETURN | |
; Подпрограмма реализации задержки | ; Подпрограмма реализации задержки | ||
| − | 170614$:MOV #1000.,R2 | + | 170614$:MOV #1000.,R2 |
| − | 170620$:MOV #1000.,R3 | + | 170620$:MOV #1000.,R3 |
| − | 170624$:SOB R3,170624$ | + | 170624$:SOB R3,170624$ |
| − | + | SOB R2,170620$ | |
| − | + | RETURN | |
; Подпрограмма тестирования процессора | ; Подпрограмма тестирования процессора | ||
| − | 170632$:CCC | + | 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$ | + | 170654$:JMP 172604$ ; Ошибка |
| − | 170660$:SEV | + | 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$ | + | 170674$:JMP 172604$ ; Ошибка |
| − | 170700$:SEZ | + | 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$ | + | 170714$:JMP 172604$ ; Ошибка |
| − | 170720$:MOV SP,R3 | + | 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 | + | 170750$:SEC ; Установка бита C |
| − | + | ROR @-(R3) ; Уст. ст. разр. в 1,выдв. млад. =0 (10...0)) | |
| − | + | BCS 170762$ ; C=1 | |
| − | + | BVC 170762$ ; V=0 | |
| − | + | BMI 170766$ ; N=1 | |
| − | 170762$:JMP 172604$ | + | 170762$:JMP 172604$ ; Ошибка |
| − | 170766$:CCC | + | 170766$:CCC ; Очистить все биты признаков |
| − | + | ASR @(R4)+ ; Оставить старший бит (110...0) | |
| − | + | BVC 170776$ ; V=0 | |
| − | + | BMI 171002$ ; N=1 | |
| − | 170776$:JMP 172604$ | + | 170776$:JMP 172604$ ; Ошибка |
| − | 171002$:CLN | + | 171002$:CLN ; Очистить бит N |
| − | + | ASL @(R3)+ ; Сдвиг влево (10...0) | |
| − | + | BCC 171014$ ; C=0 | |
| − | + | BVS 171014$ ; V=1 | |
| − | + | BMI 171020$ ; N=1 | |
| − | 171014$:JMP 172604$ | + | 171014$:JMP 172604$ ; Ошибка |
| − | 171020$:SCC | + | 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$ | + | 171034$:JMP 172604$ ; Ошибка |
| − | 171040$:NEG @-(R3) | + | 171040$:NEG @-(R3) ; Смена знака (10...01) |
| − | + | BCC 171050$ ; C=0 | |
| − | + | BVS 171050$ ; V=1 | |
| − | + | BMI 171054$ ; N=1 | |
| − | 171050$:JMP 172604$ | + | 171050$:JMP 172604$ ; Ошибка |
| − | 171054$:SEV | + | 171054$:SEV ; Установка бита V |
| − | + | COM @(R4)+ ; Инверсия (01...10) | |
| − | + | BCC 171064$ ; C=0 | |
| − | + | BVC 171070$ ; V=0 | |
| − | 171064$:JMP 172604$ | + | 171064$:JMP 172604$ ; Ошибка |
| − | 171070$:INC @(R3)+ | + | 171070$:INC @(R3)+ ; Плюс 1 (01...1) |
| − | + | BHIS 171076$ ; C=0 | |
| − | + | BPL 171102$ ; N=0 | |
| − | 171076$:JMP 172604$ | + | 171076$:JMP 172604$ ; Ошибка |
| − | 171102$:ADC @-(R4) | + | 171102$:ADC @-(R4) ; Прибавление переноса (10...0) |
| − | + | BCS 171112$ ; C=1 | |
| − | + | BVC 171112$ ; V=0 | |
| − | + | BMI 171116$ ; N=1 | |
| − | 171112$:JMP 172604$ | + | 171112$:JMP 172604$ ; Ошибка |
| − | 171116$:CCC | + | 171116$:CCC ; Очистить все биты признаков |
| − | + | ROL @(R4)+ ; Сдвиг влево (0...0) | |
| − | + | BCC 171130$ ; C=0 | |
| − | + | BVC 171130$ ; V=0 | |
| − | + | BEQ 171134$ ; Z=1 | |
| − | 171130$:JMP 172604$ | + | 171130$:JMP 172604$ ; Ошибка |
| − | 171134$:INC @-(R3) | + | 171134$:INC @-(R3) ; Плюс 1 (0...01) |
| − | + | SBC @-(R4) ; Вычитание переноса (0...0) | |
| − | + | BCS 171144$ ; C=1 | |
| − | + | BEQ 171150$ ; Z=1 | |
| − | 171144$:JMP 172604$ | + | 171144$:JMP 172604$ ; Ошибка |
| − | 171150$:MOV SP,R2 | + | 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$ | + | 171204$:JMP 172604$ ; Ошибка |
| − | 171210$:TSTB @-(R2) | + | 171210$:TSTB @-(R2) ; Проверка (Low 0...0) |
| − | + | BEQ 171220$ ; Z=1 | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 171220$:SEV | + | 171220$:SEV ; Установка бита V |
| − | + | ASRB @-(R1) ; Сдвиг вправо (High 1...1) | |
| − | + | BCC 171232$ ; C=0 | |
| − | + | BVS 171232$ ; V=1 | |
| − | + | BMI 171236$ ; N=1 | |
| − | 171232$:JMP 172604$ | + | 171232$:JMP 172604$ ; Ошибка |
| − | 171236$:INCB @(R2)+ | + | 171236$:INCB @(R2)+ ; Плюс 1 (Low 0...01) |
| − | + | BCC 171244$ ; C=0 | |
| − | + | BPL 171250$ ; N=0 | |
| − | 171244$:JMP 172604$ | + | 171244$:JMP 172604$ ; Ошибка |
| − | 171250$:CLC | + | 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$ | + | 171264$:JMP 172604$ ; Ошибка |
| − | 171270$:ASLB @(R2)+ | + | 171270$:ASLB @(R2)+ ; Сдвиг влево (High 1...10) |
| − | + | BCC 171300$ ; C=0 | |
| − | + | BVS 171300$ ; V=1 | |
| − | + | BMI 171304$ ; N=1 | |
| − | 171300$:JMP 172604$ | + | 171300$:JMP 172604$ ; Ошибка |
| − | 171304$:ADCB @-(R2) | + | 171304$:ADCB @-(R2) ; Прибавление переноса (High 1...1) |
| − | + | BCS 171312$ ; C=1 | |
| − | + | BMI 171316$ ; N=1 | |
| − | 171312$:JMP 172604$ | + | 171312$:JMP 172604$ ; Ошибка |
| − | 171316$:SCC | + | 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$ | + | 171330$:JMP 172604$ ; Ошибка |
| − | 171334$:SWAB @-(R2) | + | 171334$:SWAB @-(R2) ; Обменять байты (High 0...01 Low 1...1) |
| − | + | BMI 171344$ ; N=1 | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 171344$:SEC | + | 171344$:SEC ; Установка бита C |
| − | + | SBCB @(R1)+ ; Вычитание переноса (High 0...0) | |
| − | + | BCS 171354$ ; C=1 | |
| − | + | BEQ 171360$ ; Z=1 | |
| − | 171354$:JMP 172604$ | + | 171354$:JMP 172604$ ; Ошибка |
| − | 171360$:NEGB @(R2)+ | + | 171360$:NEGB @(R2)+ ; Смена знака (Low 0...01) |
| − | + | DECB @-(R2) ; Минус 1 (Low 0...0) | |
| − | + | BCC 171370$ ; C=0 | |
| − | + | BEQ 171374$ ; Z=1 | |
| − | 171370$:JMP 172604$ | + | 171370$:JMP 172604$ ; Ошибка |
| − | 171374$:MOV SP,R0 | + | 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$ | + | 171440$:JMP 172604$ ; Ошибка |
| − | 171444$:BIS #100000,@-(R2) ; -4(SP) = 100000 | + | 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$ | + | 171464$:JMP 172604$ ; Ошибка |
| − | 171470$:NEG @R4 | + | 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) | + | 171502$:CMP @(R2)+,@(R1)+ ; 100000 - 077777 = 1 (C=1,V=1,N=0,Z=0) |
| − | + | BVS 171512$ ; V=1 | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 171512$:COM @-(R2) | + | 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$ | + | 171524$:JMP 172604$ ; Ошибка |
| − | 171530$:SEC | + | 171530$:SEC ; Установка бита C |
| − | + | BIC @-(R2),@(R1)+ ; -2(SP) = 177776 and not 77777 = 100000 | |
| − | + | BCC 171540$ ; C=0 | |
| − | + | BMI 171544$ ; N=1 | |
| − | 171540$:JMP 172604$ | + | 171540$:JMP 172604$ ; Ошибка |
| − | 171544$:COM @-(R1) | + | 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 | + | 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) | + | 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 | + | 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$ | + | 171702$:JMP 172604$ ; Ошибка |
| − | 171706$:CMPB @(R4)+,@-(R3) ; 1 - 1 = 0 (C=0,V=0,N=0,Z=1) | + | 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$ | + | 171716$:JMP 172604$ ; Ошибка |
| − | 171722$:MOV PC,R0 | + | 171722$:MOV PC,R0 ; R0 = 171724 |
| − | + | ADD #171736$-.,R0 ; R0 = 171736 | |
| − | + | SCC ; Установить все биты признаков | |
| − | + | JMP @R0 ; PC = 171736 | |
| − | 171734$:BR 171742$ | + | 171734$:BR 171742$ |
| − | 171736$:CLN | + | 171736$:CLN ; Сбросить бит N |
| − | + | BR 171734$ | |
| − | 171742$:BCC 171752$ | + | 171742$:BCC 171752$ ; C=0 |
| − | + | BVC 171752$ ; V=0 | |
| − | + | BNE 171752$ ; Z=0 | |
| − | + | BPL 171756$ ; N=0 | |
| − | 171752$:JMP 172604$ | + | 171752$:JMP 172604$ ; Ошибка |
| − | 171756$:CLR R2 | + | 171756$:CLR R2 |
| − | + | MOV PC,R4 ; R4 = 171762 | |
| − | + | MOV R4,R0 ; R0 = 171762 | |
| − | + | BR 171772$ | |
| − | 171766$:COM R2 | + | 171766$:COM R2 ; R2 = 177777 |
| − | + | BR 172000$ | |
| − | 171772$:CMP (R4)+,(R4)+ ; R4 = 171766 | + | 171772$:CMP (R4)+,(R4)+ ; R4 = 171766 |
| − | + | TST (R4)+ ; R4 = 171770 | |
| − | + | JMP -(R4) ; PC = 171766 R4 = 171766 | |
| − | 172000$:INC R2 | + | 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$ | + | 172012$:JMP 172604$ ; Ошибка |
| − | 172016$:MOV PC,R2 | + | 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 | + | 172042$:RTS R1 |
| − | 172044$:BCC 172060$ | + | 172044$:BCC 172060$ ; C=0 |
| − | + | BVS 172060$ ; V=1 | |
| − | + | BNE 172060$ ; Z=0 | |
| − | + | BPL 172060$ ; N=0 | |
| − | + | CLR R2 | |
| − | + | BR 172042$ | |
| − | 172060$:TST (SP)+ | + | 172060$:TST (SP)+ |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172066$:MOV SP,R4 | + | 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$ | + | 172116$:JMP 172604$ ; Ошибка |
| − | 172122$:CMP #12,R3 | + | 172122$:CMP #12,R3 ; R3=12 ? |
| − | + | BEQ 172134$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172134$:TST R2 | + | 172134$:TST R2 ; R2=0 ? |
| − | + | BEQ 172144$ | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172144$:CLR R3 | + | 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$ | + | 172170$:JMP 172604$ ; Ошибка |
| − | 172174$:CMP #-1,R2 | + | 172174$:CMP #-1,R2 ; R2=-1 ? |
| − | + | BEQ 172206$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172206$:CMP #52524,R3 ; R3=52524 ? | + | 172206$:CMP #52524,R3 ; R3=52524 ? |
| − | + | BEQ 172220$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172220$:MOV #1,@R4 | + | 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$ | + | 172250$:JMP 172604$ ; Ошибка |
| − | 172254$:CMP #52524,R2 ; R2 = 52524 ? | + | 172254$:CMP #52524,R2 ; R2 = 52524 ? |
| − | + | BEQ 172266$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172266$:MOV #-1,@R4 | + | 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 | + | 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$ | + | 172344$:JMP 172604$ ; Ошибка |
| − | 172350$:CMP #125252,R2 ; R2 = 125252 ? | + | 172350$:CMP #125252,R2 ; R2 = 125252 ? |
| − | + | BEQ 172362$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172362$:TST R3 | + | 172362$:TST R3 ; R3 = 0 ? |
| − | + | BEQ 172372$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172372$:CLR R3 | + | 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$ | + | 172424$:JMP 172604$ ; Ошибка |
| − | 172430$:CMP #-1,R2 | + | 172430$:CMP #-1,R2 ; R2=-1 ? |
| − | + | BEQ 172442$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172442$:CMP #125252,R3 ; R3=125252 ? | + | 172442$:CMP #125252,R3 ; R3=125252 ? |
| − | + | BEQ 172454$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172454$:MOV #52525,@R4 | + | 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$ | + | 172500$:JMP 172604$ ; Ошибка |
| − | 172504$:CMP R2,#1 | + | 172504$:CMP R2,#1 ; R2 = 1 ? |
| − | + | BEQ 172516$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172516$:TST R3 | + | 172516$:TST R3 ; R3 = 0 ? |
| − | + | BEQ 172526$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172526$:MOV #157777,R2 | + | 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$ | + | 172554$:JMP 172604$ ; Ошибка |
| − | 172560$:CMP R2,#40000 ; R2 = 40000 ? | + | 172560$:CMP R2,#40000 ; R2 = 40000 ? |
| − | + | BEQ 172572$ ; Да | |
| − | + | JMP 172604$ ; Ошибка | |
| − | 172572$:CMP R3,#100001 ; R3 = 100001 ? | + | 172572$:CMP R3,#100001 ; R3 = 100001 ? |
| − | + | BNE 172604$ ; Z=0 (ошибка) | |
| − | + | CLR R0 ; Ошибок нет | |
| − | + | RETURN | |
| − | 172604$:MOV #1,R0 | + | 172604$:MOV #1,R0 ; Есть ошибки |
| − | + | RETURN | |
| − | 172612$:.WORD 414 | + | 172612$:.WORD 414 ; Конец стека пультового отладчика |
; Подпрограмма ввода символа с ожиданием (для ПП) | ; Подпрограмма ввода символа с ожиданием (для ПП) | ||
| − | 172614$:EMT 22 | + | 172614$:EMT 22 ; Ввод символа |
| − | + | RETURN | |
| − | + | .WORD 0,0,0,0,0 | |
; Подпрограмма вывода символа на экран (для ПП) | ; Подпрограмма вывода символа на экран (для ПП) | ||
| − | 172632$:EMT 42 | + | 172632$:EMT 42 ; Вывод символа |
| − | + | RETURN | |
| − | + | .WORD 0,0,0,0,0,0,0,0,0 | |
; Указатели на ОЗУ пультового отладчика,адрес выводимой надписи,адрес открытой | ; Указатели на ОЗУ пультового отладчика,адрес выводимой надписи,адрес открытой | ||
; ячейки,разрешение/запрет вывода надписей. Начальное значение PS и SP. | ; ячейки,разрешение/запрет вывода надписей. Начальное значение PS и SP. | ||
; Объем ОЗУ в словах. Эти данные для ПП. | ; Объем ОЗУ в словах. Эти данные для ПП. | ||
| − | 172660$:.WORD 450 | + | 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 | + | 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$ | + | 172742$:CALL 117136$ ; Поместить символ в буфер терминала |
| − | 172746$:MOV #2,@#7042 ; Передача кодов клавиатуры по каналу 0 | + | 172746$:MOV #2,@#7042 ; Передача кодов клавиатуры по каналу 0 |
| − | + | MTPS #0 ; Разрешить прерывания | |
| − | + | JMP 174152$ | |
; Подпрограмма вывода результатов стартового теста | ; Подпрограмма вывода результатов стартового теста | ||
| − | 172764$:JSR R5,117204$ ; Вывод заголовка | + | 172764$:JSR R5,117204$ ; Вывод заголовка |
| − | + | .WORD 173060$ | |
| − | + | MOV #173036$,R3 ; Адрес массива адресов надписей об ошибках | |
| − | + | BR 173004$ | |
| − | 173000$:JSR R5,117206$ ; Вывод сообщения об ошибке на экран | + | 173000$:JSR R5,117206$ ; Вывод сообщения об ошибке на экран |
| − | 173004$:MOV (R3)+,R1 ; R1 = адрес сообщения об ошибке | + | 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$ | + | 173036$:.WORD 173113$,173131$,173153$,173171$ |
; Массив адресов сообщений об ошибках ПЗУ | ; Массив адресов сообщений об ошибках ПЗУ | ||
| − | 173046$:.WORD 173213$,173232$,173235$,173240$,173243$ | + | 173046$:.WORD 173213$,173232$,173235$,173240$,173243$ |
| − | 173060$:.BYTE 15,12,40,40,33,244 | + | 173060$:.BYTE 15,12,40,40,33,244 |
| − | + | .ASCII /СТАРТОВЫЙ ТЕСТ/ | |
| − | + | .BYTE 33,277,244,15,12,12,0 | |
| − | 173113$:.ASCIZ /- ошибка ЦП/<15><12> | + | 173113$:.ASCIZ /- ошибка ЦП/<15><12> |
| − | 173131$:.ASCIZ /- ошибка ОЗУ ЦП/<15><12> | + | 173131$:.ASCIZ /- ошибка ОЗУ ЦП/<15><12> |
| − | 173153$:.ASCIZ /- ошибка ПП/<15><12> | + | 173153$:.ASCIZ /- ошибка ПП/<15><12> |
| − | 173171$:.ASCIZ /- ошибка ОЗУ ПП/<15><12> | + | 173171$:.ASCIZ /- ошибка ОЗУ ПП/<15><12> |
| − | 173213$:.ASCIZ /- ошибка ПЗУ / | + | 173213$:.ASCIZ /- ошибка ПЗУ / |
| − | 173232$:.ASCIZ /1 / | + | 173232$:.ASCIZ /1 / |
| − | 173235$:.ASCIZ /2 / | + | 173235$:.ASCIZ /2 / |
| − | 173240$:.ASCIZ /3 / | + | 173240$:.ASCIZ /3 / |
| − | 173243$:.ASCIZ /4 / | + | 173243$:.ASCIZ /4 / |
| − | 173246$:.BYTE 33,270,0 | + | 173246$:.BYTE 33,270,0 |
| − | + | .EVEN | |
; Подпрограмма перекачки пультового отладчика в системное ОЗУ ЦП | ; Подпрограмма перекачки пультового отладчика в системное ОЗУ ЦП | ||
| − | 173252$:MOV #160000/2,@#177010 ; Адрес начала системного ОЗУ ЦП | + | 173252$:MOV #<160000/2>&77777,@#177010 ; Адрес начала системного ОЗУ ЦП |
| − | + | MOV #160000,R1 ; Адрес начала пультового отладчика | |
| − | + | MOV #5305,R0 ; Размер перек. данных (160000 - 172611) | |
| − | 173270$:MOV (R1)+,@#177014 ; Цикл перекачки | + | 173270$:MOV (R1)+,@#177014 ; Цикл перекачки |
| − | + | INC @#177010 | |
| − | + | SOB R0,173270$ | |
| − | + | MOV #173356$,R1 ; Адрес подпрограмм для ЦП | |
| − | + | MOV #44,R0 ; Размер (173356 - 173465) | |
| − | 173312$:MOV (R1)+,@#177014 ; Цикл перекачки в 172612 - 172721 | + | 173312$:MOV (R1)+,@#177014 ; Цикл перекачки в 172612 - 172721 |
| − | + | INC @#177010 | |
| − | + | SOB R0,173312$ | |
| − | + | MOV @#177716,@#177014 ; (172722) = системный регистр управления | |
| − | + | MOV #173466$,R1 ; Адр. мас. для уст. знач. ССП в вект.прер. | |
| − | 173336$:MOV (R1)+,@#177010 ; Цикл установки | + | 173336$:MOV (R1)+,@#177010 ; Цикл установки |
| − | + | MOV #600,@#177014 | |
| − | + | TST @R1 ; Конец массива ? | |
| − | + | BNE 173336$ ; Нет | |
| − | + | RETURN | |
| − | 173356$:.WORD 160014$ | + | 173356$:.WORD 160014$ ; Конец стека пультового отладчика (для ЦП) |
| − | + | ; Ее адрес в СОЗУ ЦП - 172612. | |
; Подпрограмма ввода символа с ожиданием (для ЦП). Адрес в СОЗУ ЦП - 172614. | ; Подпрограмма ввода символа с ожиданием (для ЦП). Адрес в СОЗУ ЦП - 172614. | ||
| − | 173360$:MOV #177560,R5 ; R5 = адрес регистра сост. К0 (клавиатура) | + | 173360$:MOV #177560,R5 ; R5 = адрес регистра сост. К0 (клавиатура) |
| − | + | $MFPM$ ; Чтение регистра состояния | |
| − | + | TSTB R0 ; Есть символ для чтения ? | |
| − | + | BPL 173360$ ; Нет | |
| − | + | $MFPM$ ; Чтение символа | |
| − | + | RETURN | |
; Подпрограмма вывода символа на экран (для ЦП). Адрес в СОЗУ ЦП - 172632. | ; Подпрограмма вывода символа на экран (для ЦП). Адрес в СОЗУ ЦП - 172632. | ||
| − | 173376$:MOV R0,-(SP) ; Сохранить код символа в стеке | + | 173376$:MOV R0,-(SP) ; Сохранить код символа в стеке |
| − | 173400$:MOV #177564,R5 ; R5 = адрес регистра сост. К0 (терминал) | + | 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. | ; ячейки,разрешение/запрет вывода надписей. Начальное значение PS и SP. | ||
; Объем ОЗУ в словах. Эти данные для ЦП. Их адрес в СОЗУ ЦП - 172660. | ; Объем ОЗУ в словах. Эти данные для ЦП. Их адрес в СОЗУ ЦП - 172660. | ||
| − | 173424$:.WORD 160050,160100,160072,160104,200,1000,70000 | + | 173424$:.WORD 160050,160100,160072,160104,200,1000,70000 |
; Подпрограмма выбора режима работы (ЦП). Ее адрес в сист.ОЗУ ЦП - 172676. | ; Подпрограмма выбора режима работы (ЦП). Ее адрес в сист.ОЗУ ЦП - 172676. | ||
| − | 173442$:CALL 173376$ | + | 173442$:CALL 173376$ ; Посылка по каналу 0 результатов теста |
| − | 173446$:TST @#163772 ; Ожидание ответа от ПП | + | 173446$:TST @#163772 ; Ожидание ответа от ПП |
| − | + | BEQ 173446$ | |
| − | + | BPL 173462$ ; Обнаружен контроллер НГМД | |
| − | + | JMP @#162440$ ; На загрузку из сети | |
| − | 173462$:JMP @#160744 ; На вывод меню ЗАГРУЗКА | + | 173462$:JMP @#160744 ; На вывод меню ЗАГРУЗКА |
; Адреса знач. ССП в векторах прер. ЦП (в формате загрузки в рег.адреса) | ; Адреса знач. ССП в векторах прер. ЦП (в формате загрузки в рег.адреса) | ||
| − | 173466$:.WORD 70001,70003,70075,70077,70137,0 | + | 173466$:.WORD 70001,70003,70075,70077,70137,0 |
; Подпрограмма проведения инициализации | ; Подпрограмма проведения инициализации | ||
| − | 173502$:CALL | + | 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 | + | 173632$:MOV @#7040,SP ; Восстановить SP |
| − | + | MOV #-1,R0 ; Контроллер НГМД не обнаружен | |
| − | 173642$:MOV #163772$/2,@#177010 ; Адрес | + | 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 = адрес начала ОЗУ ПП пользователя | + | 173706$:MOV #23660,R0 ; R0 = адрес начала ОЗУ ПП пользователя |
| − | + | CLR (R0)+ ; Блок свободен | |
| − | + | CLR (R0)+ ; Ссылка на предыдущий блок | |
| − | + | MOV #54104,@R0 ; Размер свободного блока | |
| − | + | ADD (R0)+,R0 ; Переход к фиктивной области | |
| − | + | INC @R0 ; Признак занятой области | |
| − | + | RETURN | |
; Подпрограмма очистки блока памяти | ; Подпрограмма очистки блока памяти | ||
| − | 173730$:CLR R0 | + | 173730$:CLR R0 ; Заполняемое значение (0) |
| − | + | MOV (R5)+,R1 ; Адрес начала | |
| − | + | MOV (R5)+,R2 ; Размер в словах | |
| − | 173736$:MOV R0,(R1)+ ; Цикл очистки | + | 173736$:MOV R0,(R1)+ ; Цикл очистки |
| − | + | SOB R2,173736$ | |
| − | + | RTS R5 | |
; Подпрограмма установки векторов прерываний периферийных устройств | ; Подпрограмма установки векторов прерываний периферийных устройств | ||
| − | 173744$:MOV #174270$,@#30 ; Вектор прерывания команды EMT | + | 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 | + | 174152$:MOV #2000,SP |
| − | + | MOV #2,@#7042 ; Передача кодов клавиатуры К0 | |
| − | 174164$:MOV #7060,R0 ; R0 = буфер флагов вызова | + | 174164$:MOV #7060,R0 ; R0 = буфер флагов вызова |
| − | 174170$:TST (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) | + | 174214$:CLR 22(R0) ; Очистить адрес прерывания |
| − | + | JMP @R1 ; Переход по адресу прерывания | |
; Фиктивная подпрограмма | ; Фиктивная подпрограмма | ||
| − | 174222$:MOV #174222$,@#7126 ; Установить точку прерывания фикт. п/п | + | 174222$:MOV #174222$,@#7126 ; Установить точку прерывания фикт. п/п |
| − | + | BR 174164$ ; На начало цикла | |
; Адреса стандартных подпрограмм обработки событий : | ; Адреса стандартных подпрограмм обработки событий : | ||
; обработка скэн-кодов клавиатуры, обработка данных К2, вывод символов на | ; обработка скэн-кодов клавиатуры, обработка данных К2, вывод символов на | ||
; экран, переключение курсора, меню УСТАНОВКА, меню ЗАГРУЗКА, вывод на | ; экран, переключение курсора, меню УСТАНОВКА, меню ЗАГРУЗКА, вывод на | ||
; принтер, запуск п/п пользователя, запуск теста | ; принтер, запуск п/п пользователя, запуск теста | ||
| − | 174232$:.WORD 104306$,125030$,111144$,176056$,100040$,100742$,176076$ | + | 174232$:.WORD 104306$,125030$,111144$,176056$,100040$,100742$,176076$ |
| − | + | .WORD 176116$,176460$ | |
; Подпрограмма обработки команды TRAP 0 | ; Подпрограмма обработки команды TRAP 0 | ||
| − | 174254$:MOV @#7056,R0 ; R0 = адрес флага | + | 174254$:MOV @#7056,R0 ; R0 = адрес флага |
| − | + | MOV (SP)+,22(R0) ; Сохранить СК | |
| − | + | MTPS (SP)+ ; Установить ССП | |
| − | + | BR 174164$ ; На начало основного цикла | |
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО КОМАНДЕ EMT *** | ; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО КОМАНДЕ EMT *** | ||
| − | 174270$:MOV R5,-(SP) ; Сохранить регистры | + | 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 *** | ; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО КОМАНДЕ TRAP *** | ||
| − | 174334$:MOV @SP,R0 | + | 174334$:MOV @SP,R0 |
| − | + | MOV -(R0),R0 ; R0 = код команды TRAP | |
| − | + | JMP @<160160$-TRAP>(R0) ; Переход на соответствующую подпрограмму | |
; Обработка прерываний сетевого таймера (скроллинг назад) | ; Обработка прерываний сетевого таймера (скроллинг назад) | ||
| − | 174344$:MOV R0,-(SP) ; Сохранить R0 | + | 174344$:MOV R0,-(SP) ; Сохранить R0 |
| − | + | ADD @#7136,PC ; Рулон плавный/дискретный ? | |
| − | + | BR 174476$ ; Рулон плавный | |
| − | 174354$:MOV R1,-(SP) ; Сохранить R1 | + | 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 - общ. число видеострок экр. польз. | + | 174420$:SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз. |
| − | 174424$:MOV R0,-2(R0) ; Поместить в область описания | + | 174424$:MOV R0,-2(R0) ; Поместить в область описания |
| − | 174430$:SUB R1,R0 | + | 174430$:SUB R1,R0 ; Вычесть число видеострок для скроллинга |
| − | + | CMP R0,#2500 ; Вышло за начало ? | |
| − | + | BHI 174444$ ; Нет | |
| − | + | ADD #286.*4,R0 ; R0 = R0 + общ. число видеострок экр. польз. | |
| − | 174444$:MOV #6742,-(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 ; Адрес описания начала экр. пользователя | + | 174470$:MOV R0,@#2476 ; Адрес описания начала экр. пользователя |
| − | + | BR 174750$ | |
| − | 174476$:MOV @#2476,R0 ; R0 = адр.яч.информ. о перв. стр. экр.польз. | + | 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 ; Адрес описания начала экр. пользователя | + | 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 - общ. число видеострок экр. польз. | + | 174550$:SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз. |
| − | 174554$:MOV R0,-2(R0) ; Поместить в область описания | + | 174554$:MOV R0,-2(R0) ; Поместить в область описания |
| − | 174560$:SUB #4,R0 | + | 174560$:SUB #4,R0 ; R0 = R0 - 1 видеострока |
| − | + | CMP R0,#2500 ; На начале ? | |
| − | + | BNE 174576$ | |
| − | + | ADD #286.*4,R0 ; R0 = R0 + общ. число видеострок экр. польз. | |
| − | 174576$:MOV #6742,-(R0) ; Адрес описания нижней инф. строки | + | 174576$:MOV #6742,-(R0) ; Адрес описания нижней инф. строки |
| − | + | MOV (SP)+,R0 ; Восстановить R0 | |
| − | + | INC @#23170 ; Уменьшить число видеострок для скроллинга | |
| − | + | BR 175054$ | |
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ СЕТЕВОГО ТАЙМЕРА *** | ; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ СЕТЕВОГО ТАЙМЕРА *** | ||
| − | 174612$:TST @#23170 | + | 174612$:TST @#23170 ; Количество видеострок для скроллинга |
| − | + | BEQ 175072$ ; Нет | |
| − | + | BMI 174344$ ; Скроллинг назад | |
| − | + | MOV R0,-(SP) ; Сохранить R0 | |
| − | + | ADD @#7136,PC ; Рулон плавный/дискретный ? | |
| − | + | BR 174762$ ; Рулон плавный | |
| − | 174632$:MOV R1,-(SP) ; Сохранить R1 | + | 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 - общ. число видеострок экр. польз. | + | 174674$:SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз. |
| − | 174700$:MOV R0,-2(R0) ; Поместить в область описания | + | 174700$:MOV R0,-2(R0) ; Поместить в область описания |
| − | 174704$:ADD R1,R0 | + | 174704$:ADD R1,R0 ; Прибавить число видеострок для скроллинга |
| − | + | CMP R0,#4670 ; Вышли за конец ? | |
| − | + | BLOS 174720$ ; Нет | |
| − | + | SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз. | |
| − | 174720$:MOV #6742,-(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 ; Адрес описания начала экр. пользователя | + | 174744$:MOV R0,@#2476 ; Адрес описания начала экр. пользователя |
| − | 174750$:MOV (SP)+,R1 ; Восстановить регистры | + | 174750$:MOV (SP)+,R1 ; Восстановить регистры |
| − | + | MOV (SP)+,R0 | |
| − | + | CLR @#23170 ; Число строк для скроллинга = 0 | |
| − | + | BR 175056$ | |
| − | 174762$:MOV @#2476,R0 ; R0 = адр.яч.информ. о перв. стр. экр.польз. | + | 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 - общ. число видеострок экр. польз. | + | 175030$:SUB #286.*4,R0 ; R0 = R0 - общ. число видеострок экр. польз. |
| − | 175034$:MOV R0,-2(R0) ; Поместить в область описания | + | 175034$:MOV R0,-2(R0) ; Поместить в область описания |
| − | 175040$:MOV #6742,2(R0) ; Адрес описания нижней инф. строки | + | 175040$:MOV #6742,2(R0) ; Адрес описания нижней инф. строки |
| − | + | MOV (SP)+,R0 ; Восстановить R0 | |
| − | + | DEC @#23170 ; Уменьшить число видеострок для скроллинга | |
| − | 175054$:BNE 175306$ | + | 175054$:BNE 175306$ ; Еще остались |
| − | 175056$:MOV @#22750,@#23164 ; Разрешение/запрет использования курсора | + | 175056$:MOV @#22750,@#23164 ; Разрешение/запрет использования курсора |
| − | + | INC @#7066 ; Уст.флаг вызова п/п перекл. курсора | |
| − | + | BR 175306$ | |
| − | 175072$:ADD @#7134,PC ; Перекл. курсор/не изм. курсор/выдержка вр. | + | 175072$:ADD @#7134,PC ; Перекл. курсор/не изм. курсор/выдержка вр. |
| − | + | BR 175150$ ; Перекл. курсор, поменять его координаты | |
| − | 175102$:BR 175306$ | + | 175102$:BR 175306$ ; Не изм. состояния курсора |
| − | 175104$:DECB @#23166 | + | 175104$:DECB @#23166 ; Уменьшить счетчик выдержки времени |
| − | + | BGT 175306$ ; Время еще не окнчилось | |
| − | + | BEQ 175120$ ; Время закончилось | |
| − | + | MOV #110060,@#23162 ; Загрузить временной интервал | |
| − | 175120$:MOV @#23162,@#23166 ; Загрузить значение в счетчик | + | 175120$:MOV @#23162,@#23166 ; Загрузить значение в счетчик |
| − | + | SWAB @#23162 ; Поменять параметры выдержки(горит/не горит) | |
| − | + | BMI 175300$ ; Включить курсор | |
| − | + | ASL @#23166 | |
| − | 175140$:MOVB #177,@23160 | + | 175140$:MOVB #177,@23160 ; Убрать курсор с экрана |
| − | + | BR 175306$ | |
| − | 175150$:MOV R0,-(SP) ; Сохранить регистры | + | 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 | + | 175176$:ASL R0 ; Приведение координат в соотв. с режимом |
| − | 175200$:ROR R1 | + | 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 | + | 175300$:MOVB @#23156,@23160 ; Поместить курсор в позицию X |
| − | 175306$:TST @#7130 | + | 175306$:TST @#7130 ; Двигатель НГМД вращается ? |
| − | + | BEQ 175326$ ; Нет | |
| − | + | DEC @#7130 ; Уменьшить счетчик вращения двигателя | |
| − | + | BNE 175326$ ; Еще не конец | |
| − | + | CALL @7132 ; Вызов п/п выключения двигателя НГМД | |
| − | 175326$:DEC @#7046 | + | 175326$:DEC @#7046 ; Уменьшить сч. длительности звукового сигн. |
| − | + | BNE 175342$ ; Еще не конец | |
| − | + | BIC #17600,@#177716 ; Выключить звуковой сигнал | |
| − | 175342$:TSTB @#7227 | + | 175342$:TSTB @#7227 ; Есть данные для автоповтора клавиш |
| − | + | BEQ 175376$ ; Да | |
| − | + | DECB @#7227 ; Уменьшить сч. автоповтора | |
| − | + | BNE 175376$ ; Еще не конец | |
| − | + | INC @#7060 ; Увеличить флаг вызова п/п обр. соб. клав. | |
| − | + | BIS #200,@#177716 ; Подать полож.импульс на динамик (щелчок) | |
| − | + | MOV #1,@#7046 ; Длительность импульса | |
175376$:RTI | 175376$:RTI | ||
; Подпрограмма заполнения ячеек информацией о длительности вращения | ; Подпрограмма заполнения ячеек информацией о длительности вращения | ||
; двигателя НГМД и адресе п/п выключения двигателя | ; двигателя НГМД и адресе п/п выключения двигателя | ||
| − | 175400$:MOV (R5)+,@#7130 ; Длительность вращения двигатель НГМД | + | 175400$:MOV (R5)+,@#7130 ; Длительность вращения двигатель НГМД |
| − | + | MOV (R5)+,@#7132 ; Адрес п/п выключения двигателя НГМД | |
| − | + | RTS R5 | |
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ КЛАВИАТУРЫ *** | ; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ КЛАВИАТУРЫ *** | ||
| − | 175412$:MOVB @#177702,@7200 | + | 175412$:MOVB @#177702,@7200 ; Занести скэн-код клавиши в буфер |
| − | + | BMI 175436$ ; Клавиша отжата | |
| − | + | BIS #200,@#177716 ; Подать полож.импульс на динамик (щелчок) | |
| − | + | MOV #2,@#7046 ; Длительность импульса | |
| − | 175436$:CMPB @7200 | + | 175436$:CMPB @7200,#4 ; Нажата клавиша <СТОП> ? |
| − | + | BEQ 175466$ ; Да | |
| − | + | INC @#7200 ; Передвинуть указатель на след. позицию | |
| − | + | BIC #10,@#7200 | |
| − | + | INC @#7060 ; Увеличить флаг вызова п/п обр. соб. клав. | |
| − | + | RTI | |
| − | 175466$:MOV R0,-(SP) ; Сохранить регистры | + | 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 | ; Подпрограмма исполнения команды TRAP 2 | ||
| − | 175516$:CLR @#7230 | + | 175516$:CLR @#7230 ; Запрет вызова TRAP 2 п/п обсл. клав. |
| − | + | ADD @#7042,PC ; Передача данных по К0/в R0 | |
| − | + | BR 175540$ ; Передача в R0 | |
| − | 175530$:BIT #10,@#177076 ; Готовность передатчика К0 | + | 175530$:BIT #10,@#177076 ; Готовность передатчика К0 |
| − | + | BEQ 175646$ ; Не готов | |
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПЕРЕДАТЧИКА КАНАЛА 0(КЛАВИАТУРА) *** | ; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПЕРЕДАТЧИКА КАНАЛА 0(КЛАВИАТУРА) *** | ||
| − | 175540$:MOV R5,-(SP) ; Сохранить R5 | + | 175540$:MOV R5,-(SP) ; Сохранить R5 |
| − | + | MOV @#7206,R5 ; R5 = указатель для чтения с буфера ASCII | |
| − | 175546$:CMP R5,@#7210 ; Буфер пуст ? | + | 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 | + | 175606$:INC @R5 ; К следующему символу в строке |
| − | + | MOV #177,R5 | |
| − | 175614$:SOB R5,175614$ ; Задержка | + | 175614$:SOB R5,175614$ ; Задержка |
| − | + | BR 175632$ | |
| − | 175620$:MOV (R5)+,-(SP) ; Поместить символ в стек | + | 175620$:MOV (R5)+,-(SP) ; Поместить символ в стек |
| − | + | BIC #40,R5 | |
| − | + | MOV R5,@#7206 | |
| − | 175632$:ADD @#7042,PC ; Передача данных по К0/в R0 | + | 175632$:ADD @#7042,PC ; Передача данных по К0/в R0 |
| − | + | BR 175660$ ; Передача в R0 | |
| − | 175640$:MOV (SP)+,@#177070 ; Передача символа в К0 | + | 175640$:MOV (SP)+,@#177070 ; Передача символа в К0 |
| − | 175644$:MOV (SP)+,R5 ; Восстановить R5 | + | 175644$:MOV (SP)+,R5 ; Восстановить R5 |
175646$:RTI | 175646$:RTI | ||
| − | 175650$:MOV #2,@#7230 ; Разрешение вызова TRAP 2 п/п обсл. клав. | + | 175650$:MOV #2,@#7230 ; Разрешение вызова TRAP 2 п/п обсл. клав. |
| − | + | BR 175644$ | |
| − | 175660$:MOV (SP)+,R0 ; Передача символа в R0 | + | 175660$:MOV (SP)+,R0 ; Передача символа в R0 |
| − | + | BR 175644$ | |
; Подпрограмма исполнения команды TRAP 4 | ; Подпрограмма исполнения команды TRAP 4 | ||
| − | 175664$:CLR @#22546 | + | 175664$:CLR @#22546 ; Запрет вызова TRAP 4 п/п обсл. терминала |
| − | + | BIT #10,@#177066 ; Готовность приемника К0 | |
| − | + | BEQ 175742$ ; Не готов | |
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 0(ТЕРМИНАЛ) *** | ; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 0(ТЕРМИНАЛ) *** | ||
| − | 175700$:ADD @#7042,PC ; Передача данных по К0/в R0 | + | 175700$:ADD @#7042,PC ; Передача данных по К0/в R0 |
| − | + | BR 175752$ ; Передача в R0 | |
| − | 175706$:CMP @#7064,#177 ; Буфер заполнен полностью ? | + | 175706$:CMP @#7064,#177 ; Буфер заполнен полностью ? |
| − | + | BEQ 175744$ ; Да | |
| − | + | MOVB @#177060,@22544 ; Занести символ в буфер | |
| − | + | INC @#22544 ; Подкорректировать указатель буфера | |
| − | + | BIC #200,@#22544 | |
| − | + | INC @#7064 ; Увеличить флаг вызова п/п обсл. терм. | |
175742$:RTI | 175742$:RTI | ||
| − | 175744$:MOV #2,@#22546 ; Разрешение выз. TRAP 4 п/п обсл. терминала | + | 175744$:MOV #2,@#22546 ; Разрешение выз. TRAP 4 п/п обсл. терминала |
175752$:RTI | 175752$:RTI | ||
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 1(ПРИНТЕР) *** | ; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 1(ПРИНТЕР) *** | ||
| − | 175754$:INC @#7074 | + | 175754$:INC @#7074 ; Уст. флаг вызова п/п обсл. принтера |
| − | + | RTI | |
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 2 *** | ; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЙ ОТ ПРИЕМНИКА КАНАЛА 2 *** | ||
| − | 175762$:MOV R0,-(SP) ; Сохранить R0 | + | 175762$:MOV R0,-(SP) ; Сохранить R0 |
| − | + | MOV @#23202,R0 ; R0 = счетчик принятых байтов | |
| − | + | BMI 176046$ ; В состоянии инициализации | |
| − | + | CMP R0,#2 ; Адрес МП передан | |
| − | + | BHIS 176016$ ; Да | |
| − | + | MOVB @#177064,23200(R0) ; Передача данных в буфер (адрес МП) | |
| − | 176006$:INC @#23202 | + | 176006$:INC @#23202 ; Увеличить счетчик принятых байтов |
| − | 176012$:MOV (SP)+,R0 ; Восстановить R0 | + | 176012$:MOV (SP)+,R0 ; Восстановить R0 |
| − | + | RTI | |
| − | 176016$:BNE 176034$ | + | 176016$:BNE 176034$ ; Принято 3 байта |
| − | + | TSTB @#177064 ; 3-й байт равен нулю ? | |
| − | + | BNE 176006$ ; Нет | |
| − | + | COM @#23202 ; Инвертировать счетчик (инициализация канала) | |
| − | + | BR 176012$ | |
| − | 176034$:INC @#7062 | + | 176034$:INC @#7062 ; Установить флаг вызова п/п обсл. К2 |
| − | 176040$:CLR @#23202 | + | 176040$:CLR @#23202 ; Очистить счетчик |
| − | + | BR 176012$ | |
| − | 176046$:TSTB @#177064 ; Принятый байт равен нулю ? | + | 176046$:TSTB @#177064 ; Принятый байт равен нулю ? |
| − | + | BEQ 176012$ ; Да | |
| − | + | BR 176040$ | |
; Подпрограмма переключения режима курсора | ; Подпрограмма переключения режима курсора | ||
| − | 176056$:CLR @#7066 | + | 176056$:CLR @#7066 ; Очистка флага вызова п/п |
| − | + | ADD @#23164,PC ; Разрешение / запрет использования курсора | |
| − | + | RETURN ; Запрет использования курсора | |
| − | 176070$:CLR @#7134 | + | 176070$:CLR @#7134 ; Поменять позицию курсора и включить его |
| − | + | RETURN | |
; Подпрограмма печати символа на принтере, переданного по К1 | ; Подпрограмма печати символа на принтере, переданного по К1 | ||
| − | 176076$:CLR @#7074 | + | 176076$:CLR @#7074 ; Очистить флаг вызова п/п |
| − | + | MOV @#177062,-(SP) ; Поместить символ в стек | |
| − | + | CALL 135722$ ; Печать символа на принтере | |
| − | + | TST (SP)+ | |
| − | + | RETURN | |
; Подпрограмма вызова процедуры пользователя | ; Подпрограмма вызова процедуры пользователя | ||
| − | 176116$:CALL @7140 | + | 176116$:CALL @7140 ; Вызов процедуры пользователя |
| − | + | CLR @#7076 ; Очистить флаг вызова п/п | |
| − | + | RETURN | |
; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО ПОЯВ. НА КАНАЛЕ ЦП СИГНАЛА RESET *** | ; *** ПОДПРОГРАММА ОБРАБОТКИ ПРЕРЫВАНИЯ ПО ПОЯВ. НА КАНАЛЕ ЦП СИГНАЛА RESET *** | ||
176130$:RTI | 176130$:RTI | ||
; Подпрограмма запроса блока памяти | ; Подпрограмма запроса блока памяти | ||
| − | 176132$:MOV R0,R1 | + | 176132$:MOV R0,R1 ; R1 = размер запрашиваемого блока |
| − | + | BMI 176142$ ; Найти максимальный блок | |
| − | + | ROR R1 ; Приведение к четному адресу | |
| − | + | ADC R0 | |
| − | 176142$:MOV R2,-(SP) ; Сохранить R2 | + | 176142$:MOV R2,-(SP) ; Сохранить R2 |
| − | + | CLR R2 ; R2 = адрес найденного блока | |
| − | + | CLR -(SP) ; Размер найденного блока | |
| − | 176150$:MOV #23660,R1 ; R1 = адрес начала ОЗУ пользователя | + | 176150$:MOV #23660,R1 ; R1 = адрес начала ОЗУ пользователя |
| − | 176154$:TST (R1)+ | + | 176154$:TST (R1)+ ; Блок занят ? |
| − | + | BEQ 176176$ ; Нет | |
| − | + | TST (R1)+ | |
| − | 176162$:ADD (R1)+,R1 ; Переход к следующему блоку | + | 176162$:ADD (R1)+,R1 ; Переход к следующему блоку |
| − | + | BPL 176154$ ; Еще не конец ОЗУ | |
| − | + | TST R2 ; Найден свободный блок ? | |
| − | + | BNE 176150$ ; Да | |
| − | + | CLR R0 ; Нет свободной памяти | |
| − | + | BR 176272$ | |
| − | 176176$:TST (R1)+ | + | 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 | + | 176222$:MOV @SP,R0 ; R0 = размер найденного макс. блока |
| − | + | BR 176232$ | |
| − | 176226$:INC -4(R1) | + | 176226$:INC -4(R1) ; Пометить блок, как занятый |
| − | 176232$:MOV (R1)+,R2 ; R2 = размер блока | + | 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)+ | + | 176272$:TST (SP)+ |
| − | + | MOV (SP)+,R2 ; Восстановить R2 | |
| − | + | RETURN | |
; Подпрограмма освобождения блока памяти | ; Подпрограмма освобождения блока памяти | ||
| − | 176300$:TST R1 | + | 176300$:TST R1 ; Освободить блок или всю память ? |
| − | + | BPL 176310$ ; Освободить блок | |
| − | + | JMP 173706$ ; Освободить всю память | |
| − | 176310$:MOV #23660,R0 ; R0 = адрес начала ОЗУ пользователя | + | 176310$:MOV #23660,R0 ; R0 = адрес начала ОЗУ пользователя |
| − | 176314$:ADD #6,R0 | + | 176314$:ADD #6,R0 ; Плюс размер заголовка |
| − | + | BMI 176374$ ; Достигнут конец ОЗУ | |
| − | + | CMP R0,R1 ; Адрес освоб. блока равен текущему | |
| − | + | BEQ 176342$ ; Да | |
| − | + | ADD -2(R0),R0 ; Переход к следующему блоку | |
| − | + | BR 176314$ | |
| − | 176334$:MOV @R1,R1 | + | 176334$:MOV @R1,R1 ; R1 = адрес предыдущего блока |
| − | + | ADD #6,R1 ; Плюс размер заголовка | |
| − | 176342$:CLR -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) | + | 176370$:TST @-(R1) ; Блок выше свободный ? |
| − | + | BEQ 176334$ ; Да | |
176374$:RETURN | 176374$:RETURN | ||
; Подпрограмма резервирования программируемого таймера за процессом | ; Подпрограмма резервирования программируемого таймера за процессом | ||
| − | 176376$:TST @#7050 | + | 176376$:TST @#7050 ; Программируемый таймер занят ? |
| − | + | BEQ 176416$ ; Да | |
| − | + | CLR @#177710 ; Останов таймера | |
| − | + | CLR @#7050 ; Таймер занят | |
| − | + | RETURN | |
| − | 176416$:SEC | + | 176416$:SEC ; Признак занятости таймера |
| − | + | RETURN | |
; Подпрограмма освобождения процессом программируемого таймера | ; Подпрограмма освобождения процессом программируемого таймера | ||
| − | 176422$:MOV #4,@#7050 ; Признак свободного таймера | + | 176422$:MOV #4,@#7050 ; Признак свободного таймера |
| − | + | MOV #174612$,@#304 ; Восстановить вектор прерывания | |
| − | + | MOV #200,@#306 | |
| − | + | CLR @#177712 ; Очистить буферный регистр таймера | |
| − | + | MOV #1,@#177710 ; Пуск таймера | |
| − | + | RETURN | |
; Подпрограмма запуска тестов в ПП | ; Подпрограмма запуска тестов в ПП | ||
| − | 176460$:CALL 176472$ | + | 176460$:CALL 176472$ ; Запустить тесты |
| − | + | CLR @#7100 ; Очистить флаг вызова п/п | |
| − | + | RETURN | |
; Подпрограмма вызова тестов и передачи результатов в ОЗУ ЦП | ; Подпрограмма вызова тестов и передачи результатов в ОЗУ ЦП | ||
| − | 176472$:MTPS #200 | + | 176472$:MTPS #200 ; Запретить прерывания |
| − | + | MOV #176656$,@#300 ; Переназначить вектор прерывания клавиатуры | |
| − | + | CALL 160410$ ; Тест ПЗУ | |
| − | + | CLR R1 ; R1 = 0 (смещение в буфере ошибок) | |
| − | 176512$:ASR R0 | + | 176512$:ASR R0 |
| − | + | BCS 176522$ ; Ошибка банка ПЗУ | |
| − | + | BNE 176526$ ; Еще есть ошибки | |
| − | + | BR 176532$ | |
| − | 176522$:CALL 176626$ | + | 176522$:CALL 176626$ ; Установка счетчика ошибок в ОЗУ ЦП |
| − | 176526$:INC R1 | + | 176526$:INC R1 ; Переход к след.ячейке в ОЗУ ЦП |
| − | + | BR 176512$ | |
| − | 176532$:CALL 170632$ | + | 176532$:CALL 170632$ ; Тест процессора |
| − | + | MTPS #0 ; Разрешить прерывания | |
| − | + | TST R0 ; Есть ошибки ? | |
| − | + | BEQ 176556$ ; Нет | |
| − | + | MOV #5,R1 ; R1 = 5 (смещение в буфере ошибок) | |
| − | + | CALL 176626$ ; Установка счетчика ошибок в ОЗУ ЦП | |
| − | 176556$:MOV #-1,R0 | + | 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 | + | 176614$:MOV #177,R0 |
| − | + | CALL 104160$ ; Посл. ЦП по К0 символ с кодом 177(тест окон.) | |
| − | + | RETURN | |
; Подпрограмма установки счетчика ошибок в ОЗУ ЦП | ; Подпрограмма установки счетчика ошибок в ОЗУ ЦП | ||
| − | 176626$:MOV #177700/2,@#177010 ; Адрес буфера счетчиков ошибок | + | 176626$:MOV #<177700/2>&77777,@#177010 ; Адрес буфера счетчиков ошибок |
| − | + | ADD R1,@#177010 ; Прибавить смещение | |
| − | + | CMP #-1,@#177014 ; Значение счетчика достигло максимума | |
| − | + | BEQ 176654$ ; Да | |
| − | + | INC @#177014 ; Увеличить значение счетчика ошибок | |
176654$:RETURN | 176654$:RETURN | ||
; Подпрограмма обработки прерываний от клавиатуры во время тестирования | ; Подпрограмма обработки прерываний от клавиатуры во время тестирования | ||
| − | 176656$:CMP #4,@#177702 ; Нажата клавиша <СТОП> ? | + | 176656$:CMP #4,@#177702 ; Нажата клавиша <СТОП> ? |
| − | + | BNE 176672$ ; Нет | |
| − | + | JMP @160000$ ; Перезапуск компьютера | |
176672$:RTI | 176672$:RTI | ||
� | � | ||
| Line 2,623: | Line 2,641: | ||
; ***************************************************************** | ; ***************************************************************** | ||
| − | + | .=176770 | |
| − | 176770$:.WORD 63160 | + | 176770$:.WORD 63160 ; Адреса 100000 - 117777 |
| − | 176772$:.WORD 133314 | + | 176772$:.WORD 133314 ; Адреса 120000 - 137777 |
| − | 176774$:.WORD 162125 | + | 176774$:.WORD 162125 ; Адреса 140000 - 157777 |
| − | 176776$:.WORD 103607 | + | 176776$:.WORD 103607 ; Адреса 160000 - 176775 |
; * * * * * * * * * * * E n d o f R O M * * * * * * * * * * * | ; * * * * * * * * * * * E n d o f R O M * * * * * * * * * * * | ||
| − | + | .END | |
</pre> | </pre> | ||
Latest revision as of 08:47, 13 January 2008
; *****************************************************************
; * *
; * ПРОГРАММА НАЧАЛЬНОГО ЗАПУСКА СИСТЕМЫ, ПУЛЬТОВЫЙ МОНИТОР, *
; * ЗАГРУЗЧИКИ, ТЕСТОВЫЕ ПОДПРОГРАММЫ, ОБРАБОТЧИКИ ПРЕРЫВАНИЙ *
; * *
; * Адреса 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