Difference between revisions of "Uknc ROM disasm - 4"
From Felixl.com
Jump to navigationJump to search (Исправлены ошибки) |
|||
Line 1: | Line 1: | ||
<pre> | <pre> | ||
+ | |||
; ****************************************************** | ; ****************************************************** | ||
; * * | ; * * | ||
Line 9: | Line 10: | ||
; *** ОСНОВНАЯ ПОДПРОГРАММА ОБСЛУЖИВАНИЯ КАНАЛА 2 *** | ; *** ОСНОВНАЯ ПОДПРОГРАММА ОБСЛУЖИВАНИЯ КАНАЛА 2 *** | ||
− | 125030$:MOV @#23200,R0 ; R0 = адрес массива параметров (МП) в ОЗУ ЦП | + | 125030$:MOV @#23200,R0 ; R0 = адрес массива параметров (МП) в ОЗУ ЦП |
− | + | CLC ; Преобр. для загрузки в рег. адреса планов | |
− | + | ROR R0 | |
− | + | MOV R0,@#23200 | |
− | + | INC R0 ; R0 = адрес типа устройства | |
− | + | MOV R0,@#177010 | |
− | + | MOVB @#177014,R0 ; R0 = тип устройства | |
− | + | MOV R0,R5 | |
− | + | ASH #-3,R0 | |
− | + | CMP R0,#3 ; Тип устройства в пределах 0 - 37 ? | |
− | + | BHI 125116$ ; Нет | |
− | + | ASL R0 | |
− | + | BNE 125104$ ; Обслуживается не дисковод | |
− | + | TST @#7044 ; Разрешено обращение к дисководу ? | |
− | + | BMI 125116$ ; Нет | |
− | 125104$:CALL @125124$(R0) ; Вызов соответствующей п/п обслуживания уст-ва | + | 125104$:CALL @125124$(R0) ; Вызов соответствующей п/п обслуживания уст-ва |
− | 125110$:DEC @#7062 | + | 125110$:DEC @#7062 ; Уменьшить значение флага вызова |
− | + | RETURN | |
− | 125116$:CALL 125162$ | + | 125116$:CALL 125162$ ; Вызов п/п обслуживания кассеты ПЗУ |
− | + | BR 125110$ | |
; Адреса п/п обслуживания устройств (дисковод, магнитофон, кассета ПЗУ, ОЗУ ПП) | ; Адреса п/п обслуживания устройств (дисковод, магнитофон, кассета ПЗУ, ОЗУ ПП) | ||
− | 125124$:.WORD 131176$,126236$,125162$,125644$ | + | 125124$:.WORD 131176$,126236$,125162$,125644$ |
; П/п окончания обслуживания устройства | ; П/п окончания обслуживания устройства | ||
− | 125134$:CLRB @#23334 | + | 125134$:CLRB @#23334 ; Сбросить код возврата (все нормально) |
− | 125140$:MOV @#23200,@#177010 | + | 125140$:MOV @#23200,@#177010 |
− | + | MOV @#23334,@#177014; Записать код возврата в ОЗУ ЦП | |
− | 125154$:TST @#177064 ; Восст. готовность канала 2 со стороны ЦП | + | 125154$:TST @#177064 ; Восст. готовность канала 2 со стороны ЦП |
− | + | RETURN | |
; П/п обслуживания кассеты ПЗУ | ; П/п обслуживания кассеты ПЗУ | ||
− | 125162$:JSR R5,125560$ ; Чтение МП | + | 125162$:JSR R5,125560$ ; Чтение МП |
− | + | .WORD 5 | |
− | + | CMPB #10,23335 ; Код функции = 10 (чтение) ? | |
− | + | BEQ 125210$ | |
− | 125200$:MOVB #2,23334 ; Код возврата = 2 (ошибочный МП) | + | 125200$:MOVB #2,23334 ; Код возврата = 2 (ошибочный МП) |
− | + | BR 125520$ | |
− | 125210$:MOV 23340,R1 ; R1 = адрес кассеты ПЗУ | + | 125210$:MOV 23340,R1 ; R1 = адрес кассеты ПЗУ |
− | + | CMP #60000,R1 ; Он превышает 60000 ? | |
− | + | BLOS 125200$ ; Да | |
− | + | BIC #1,R1 | |
− | + | MOV 23342,R2 ; R2 = адрес буфера в ОЗУ ЦП | |
− | + | CMP #160000,R2 ; Он превышает 160000 ? | |
− | + | BLOS 125200$ ; Да | |
− | + | ASR R2 | |
− | + | BIC #100000,R2 | |
− | + | MOV 23344,R3 ; R3 = число считываемых слов | |
− | + | BEQ 125514$ ; Оно равно нулю | |
− | + | MOVB 23337,R0 ; R0 = номер кассеты ПЗУ | |
− | + | MTPS #200 ; Запретить прерывания | |
− | + | MOV @#4,R5 ; Сохранить значение 4 вектора в R5 | |
− | + | MOV #125544$,@#4 ; Загрузить новое значение вектора | |
− | + | BIC #1,@#177054 ; Откл. сист. ПЗУ в диапазоне 100000-117777 | |
− | + | ASR R0 ; Кассета N1 ? | |
− | + | BCS 125320$ ; Нет | |
− | + | BIC #10,@#177054 ; Выбор кассеты N1 | |
− | + | BR 125326$ | |
− | 125320$:BIS #10,@#177054 ; Выбор кассеты N2 | + | 125320$:BIS #10,@#177054 ; Выбор кассеты N2 |
− | 125326$:BIC #6,@#177054 ; Ни одного банка не выбрано | + | 125326$:BIC #6,@#177054 ; Ни одного банка не выбрано |
− | + | CMP R1,#17776 ; Адрес кассеты меньше 20000 ? | |
− | + | BHI 125354$ ; Нет | |
− | + | MOV #2,R4 | |
− | + | BIS R4,@#177054 ; Выбор банка N1 | |
− | + | BR 125406$ | |
− | 125354$:CMP R1,#37776 ; Адрес кассеты меньше 40000 ? | + | 125354$:CMP R1,#37776 ; Адрес кассеты меньше 40000 ? |
− | + | BHI 125376$ ; Нет | |
− | + | BIS #4,@#177054 ; Выбор банка N2 | |
− | + | MOV #1,R4 | |
− | + | BR 125406$ | |
− | 125376$:BIS #6,@#177054 ; Выбор банка N3 | + | 125376$:BIS #6,@#177054 ; Выбор банка N3 |
− | + | CLR R4 | |
− | 125406$:BIC #60000,R1 | + | 125406$:BIC #60000,R1 |
− | + | BIS #100000,R1 | |
− | + | MOV #120000,R0 | |
− | + | SUB R1,R0 ; Вычисление граничных значений | |
− | + | ASR R0 | |
− | 125426$:CMP R3,R0 | + | 125426$:CMP R3,R0 ; Область перекачки содержится в одном банке ? |
− | + | BHI 125440$ ; Нет | |
− | + | MOV R3,R0 | |
− | + | CLR R3 | |
− | + | BR 125442$ | |
− | 125440$:SUB R0,R3 | + | 125440$:SUB R0,R3 ; Вычесть из числа запрошенных слов |
− | 125442$:MOV R2,@#177010 ; Цикл перекачки | + | 125442$:MOV R2,@#177010 ; Цикл перекачки |
− | + | MOV (R1)+,@#177014 | |
− | + | INC R2 | |
− | + | CMP #70000,R2 ; Произошел выход за диапазон ОЗУ ЦП (160000) ? | |
− | + | BLOS 125200$ ; Да | |
− | + | SOB R0,125442$ | |
− | + | TST R3 ; Перекачка закончена ? | |
− | + | BEQ 125514$ ; Да | |
− | + | DEC R4 ; Переход к следующему банку | |
− | + | BMI 125200$ ; Переход за границу кассеты ПЗУ | |
− | + | ADD #2,@#177054 ; Установить следующий банк | |
− | + | MOV #100000,R1 | |
− | + | MOV #10000,R0 | |
− | + | BR 125426$ | |
− | 125514$:CLRB 23334 | + | 125514$:CLRB 23334 ; Очистить код возврата (все нормально) |
− | 125520$:BIS #1,@#177054 ; Подключить системное ПЗУ | + | 125520$:BIS #1,@#177054 ; Подключить системное ПЗУ |
− | + | MOV R5,@#4 ; Восстановить 4 вектор | |
− | + | MTPS #0 ; Разрешить прерывания | |
− | + | CALL 125140$ ; Завершить обслуживание | |
− | + | RETURN | |
; П/п обработки прерывания 4 при чтении с кассеты ПЗУ | ; П/п обработки прерывания 4 при чтении с кассеты ПЗУ | ||
− | 125544$:MOVB #1,23334 ; Код возврата = 1 (отсутствует банк ПЗУ) | + | 125544$:MOVB #1,23334 ; Код возврата = 1 (отсутствует банк ПЗУ) |
− | + | TST (SP)+ ; Вычеркнуть из стека значения PC и PS | |
− | + | TST (SP)+ | |
− | + | BR 125520$ | |
; П/п чтения МП из ОЗУ ЦП | ; П/п чтения МП из ОЗУ ЦП | ||
− | 125560$:MOV (R5)+,R0 ; R0 = число слов для чтения | + | 125560$:MOV (R5)+,R0 ; R0 = число слов для чтения |
− | + | MOV #23334,R1 ; R1 = адрес МП в ОЗУ ПП | |
− | + | MOV @#23200,@#177010 | |
− | + | BR 125602$ | |
− | 125576$:INC @#177010 ; Цикл чтения | + | 125576$:INC @#177010 ; Цикл чтения |
− | 125602$:MOV @#177014,(R1)+ | + | 125602$:MOV @#177014,(R1)+ |
− | + | SOB R0,125576$ | |
− | + | RTS R5 | |
; П/п записи МП в ОЗУ ЦП | ; П/п записи МП в ОЗУ ЦП | ||
− | 125612$:MOV (R5)+,R0 ; R0 = число слов для записи | + | 125612$:MOV (R5)+,R0 ; R0 = число слов для записи |
− | + | MOV #23334,R1 ; R1 = адрес МП в ОЗУ ПП | |
− | + | MOV @#23200,@#177010 | |
− | + | BR 125634$ | |
− | 125630$:INC @#177010 ; Цикл записи | + | 125630$:INC @#177010 ; Цикл записи |
− | 125634$:MOV (R1)+,@#177014 | + | 125634$:MOV (R1)+,@#177014 |
− | + | SOB R0,125630$ | |
− | + | RTS R5 | |
; П/п обслуживания функций работы с памятью ПП | ; П/п обслуживания функций работы с памятью ПП | ||
− | 125644$:JSR R5,125560$ ; Чтение МП | + | 125644$:JSR R5,125560$ ; Чтение МП |
− | + | .WORD 5 | |
− | + | CLRB @#23334 ; Код возврата = 0 | |
− | + | CMP R5,#32 ; Тип устройства = 32 ? | |
− | + | BNE 125720$ ; Нет | |
− | + | MOVB @#23335,R0 ; R0 = код функции | |
− | + | MOV R0,R5 | |
− | + | ASH #-3,R0 | |
− | + | CMP R0,#3 ; Код функции в пределах 0 - 37 ? | |
− | + | BHI 125720$ ; Нет | |
− | + | ASL R0 | |
− | + | ADD R0,PC ; Переход по соответствующему адресу | |
− | + | BR 125730$ ; Запрос и освобождение блоков памяти | |
− | + | BR 126024$ ; Чтение памяти ПП | |
− | + | BR 126050$ ; Запись в память ПП | |
− | + | BR 126074$ ; Запуск п/п пользователя | |
− | 125720$:JMP 125162$ | + | 125720$:JMP 125162$ |
− | 125724$:JMP 125154$ | + | 125724$:JMP 125154$ |
; Запрос и освобождение блоков памяти | ; Запрос и освобождение блоков памяти | ||
− | 125730$:MOV @#23340,R1 ; R1 = начальный адрес в памяти ПП | + | 125730$:MOV @#23340,R1 ; R1 = начальный адрес в памяти ПП |
− | + | MOV @#23342,R0 ; R0 = размер блока в словах | |
− | + | ASL R0 | |
− | + | ASR R5 ; Функция запроса блока памяти ? | |
− | + | BCC 126012$ ; Нет | |
− | + | CALL 176132$ ; Запросить область памяти | |
− | + | ASR R0 | |
− | + | CMP R0,@#23342 ; Полученное значение >= запрошенного ? | |
− | + | BHIS 125770$ ; Да | |
− | + | MOVB #377,@#23334 ; Код возврата = 377 (мало памяти) | |
− | 125770$:MOV R0,@#23342 ; Возвратить объем полученной памяти | + | 125770$:MOV R0,@#23342 ; Возвратить объем полученной памяти |
− | + | MOV R1,@#23340 ; Возвратить адрес блока | |
− | + | JSR R5,125612$ ; Записать МП в ОЗУ ЦП | |
− | + | .WORD 4 | |
− | + | JMP 125154$ | |
− | 126012$:CALL 176300$ | + | 126012$:CALL 176300$ ; Освободить блок памяти |
− | + | BMI 125720$ | |
− | + | JMP 125140$ | |
; Чтение памяти ПП | ; Чтение памяти ПП | ||
− | 126024$:CALL 126110$ | + | 126024$:CALL 126110$ ; Получение адресов ЦП, ПП и числа слов |
− | + | BEQ 125720$ ; Число слов равно нулю | |
− | + | BR 126040$ | |
− | 126034$:INC @#177010 ; Цикл чтения | + | 126034$:INC @#177010 ; Цикл чтения |
− | 126040$:MOV (R1)+,@#177014 | + | 126040$:MOV (R1)+,@#177014 |
− | + | SOB R0,126034$ | |
− | + | BR 125724$ | |
; Запись в память ПП | ; Запись в память ПП | ||
− | 126050$:CALL 126110$ | + | 126050$:CALL 126110$ ; Получение адресов ЦП, ПП и числа слов |
− | + | BEQ 125720$ ; Число слов равно нулю | |
− | + | BR 126064$ | |
− | 126060$:INC @#177010 ; Цикл записи | + | 126060$:INC @#177010 ; Цикл записи |
− | 126064$:MOV @#177014 | + | 126064$:MOV @#177014,(R1)+ |
− | + | SOB R0,126060$ | |
− | + | BR 125724$ | |
; Запуск п/п пользователя | ; Запуск п/п пользователя | ||
− | 126074$:MOV @#23340,@#7140 ; Сохранение адреса запуска | + | 126074$:MOV @#23340,@#7140 ; Сохранение адреса запуска |
− | + | INC @#7076 ; Установить флаг запуска п/п пользователя | |
− | + | BR 125724$ | |
; П/п получения адресов блоков памяти ЦП, ПП и числа слов для обмена | ; П/п получения адресов блоков памяти ЦП, ПП и числа слов для обмена | ||
− | 126110$:MOV @#23340,R1 ; R1 = адрес памяти ПП | + | 126110$:MOV @#23340,R1 ; R1 = адрес памяти ПП |
− | + | MOV @#23342,R0 ; R0 = адрес памяти ЦП | |
− | + | CLC | |
− | + | ROR R0 | |
− | + | MOV R0,@#177010 ; Загрузка адреса в регистр адреса планов | |
− | + | MOV @#23344,R0 ; R0 = число слов для обмена | |
− | + | RETURN | |
; *** МАГНИТОФОН *** | ; *** МАГНИТОФОН *** | ||
; П/п установки начальных значений | ; П/п установки начальных значений | ||
− | 126136$:CLR R0 | + | 126136$:CLR R0 |
− | + | MOV #23304,R1 | |
− | + | MOV #14,R2 | |
− | 126150$:MOV R0,(R1)+ ; Очистка области ОЗУ п/п работы с магнитофоном | + | 126150$:MOV R0,(R1)+ ; Очистка области ОЗУ п/п работы с магнитофоном |
− | + | SOB R2,126150$ | |
− | + | MOV #320,23304 ; Длина бита "0" | |
− | + | MOV #150,23306 ; Длина бита "1" | |
− | + | MOV #17500,23310 ; Число битов "1" при записи пилот-тона загол. | |
− | + | MOV #3720,23312 ; Число битов "1" при записи пилот-тона данных | |
− | + | MOV #17540,23314 ; Число битов "1" при чтении пилот-тона загол. | |
− | + | MOV #1750,23316 ; Число битов "1" при чтении пилот-тона данных | |
− | + | MOV #1750,23320 | |
− | + | MOV #64,23322 ; Разброс времени между перепадами лог. уровня | |
− | + | RETURN | |
; Основная п/п обслуживания магнитофона | ; Основная п/п обслуживания магнитофона | ||
− | 126236$:JSR R5,125560$ ; Чтение массива параметров | + | 126236$:JSR R5,125560$ ; Чтение массива параметров |
− | + | .WORD 27 | |
− | + | CLR R5 | |
− | 126246$:SOB R5,126246$ ; Задержка | + | 126246$:SOB R5,126246$ ; Задержка |
− | + | MTPS #200 ; Запретить прерывания | |
− | + | CALL 176376$ ; Останов программируемого таймера | |
− | + | CALL 130672$ ; Ожидание готовности программируемого таймера | |
− | + | MOV #127734$,@#304 ; Настройка вектора прерывания прогр. таймера | |
− | + | MOV #200,@#306 | |
− | + | MOV #130570$,@#310 ; Настройка вектора прерывания по внеш. событию | |
− | + | MOV #200,@#312 | |
− | + | CLR @#177700 ; Запрет прерываний от клавиатуры | |
− | + | BIS #400,@#177054 ; Запрет прерываний от сет. таймера в канале ПП | |
− | + | BIC #200,@#177716 ; Выключить генератор звукового сигнала | |
− | + | BIC #107,@#177066 ; Запретить прерывания от каналов связи с ЦП | |
− | + | MOVB 23335,R0 ; R0 = код функции | |
− | + | BIC #177600,R0 | |
− | + | ASL R0 | |
− | + | CALL @126502$(R0) ; Вызов соответствующей п/п | |
− | + | MOVB R0,23334 ; Код возврата | |
− | + | BIC #14,@#177716 ; Запрет приема информации по линии вн. событие | |
− | + | CALL 130672$ | |
− | + | MOV 23200,R4 ; R4 = адрес МП в ОЗУ ЦП | |
− | + | ADD #14,R4 | |
− | + | MOV R4,@#177010 | |
− | + | MOV #23364,R4 ; R4 = адрес МП в ОЗУ ПП (имя прочит. файла) | |
− | + | MOV #13,R2 | |
− | 126422$:MOV (R4)+,@#177014 ; Пересылка | + | 126422$:MOV (R4)+,@#177014 ; Пересылка |
− | + | INC @#177010 | |
− | + | SOB R2,126422$ | |
− | + | BIC #400,@#177054 ; Разрешить прерывания от таймера в канале ПП | |
− | + | MOV #100,@#177700 ; Разрешить прерывания от клавиатуры | |
− | + | BIS #200,@#177716 ; Включить генератор звукового сигнала | |
− | + | BIS #107,@#177066 ; Разрешить прерывания от каналов связи с ЦП | |
− | + | CALL 125140$ ; Переслать код возврата в ОЗУ ЦП | |
− | + | CALL 176422$ ; Запрет прерываний от прогр. таймера | |
− | + | MTPS #0 ; Разрешить прерывания | |
− | + | RETURN | |
; Адреса п/п обслуживания работы с магнитофоном | ; Адреса п/п обслуживания работы с магнитофоном | ||
− | 126502$:.WORD 126546$,126554$,126632$,126546$ | + | 126502$:.WORD 126546$,126554$,126632$,126546$ |
− | + | .WORD 126546$,126546$,126546$,126546$ | |
− | + | .WORD 127102$,127110$,126546$,126546$ | |
− | + | .WORD 127116$,127132$,127044$,126546$ | |
− | + | .WORD 126714$,126662$ | |
− | 126546$:MOV #10,R0 | + | 126546$:MOV #10,R0 ; R0 = код возврата (неверный код функции) |
− | + | RETURN | |
; П/п установки параметров одинарной плотности записи | ; П/п установки параметров одинарной плотности записи | ||
− | 126554$:MOV #320,23304 | + | 126554$:MOV #320,23304 ; Длина бита "0" |
− | + | MOV #150,23306 ; Длина бита "1" | |
− | + | MOV #17500,23310 ; Число битов "1" перед заголовком | |
− | + | MOV #3720,23312 ; Число битов "1" перед зоной данных | |
− | + | MOV #17540,23314 ; Число перепадов уровня при чтении (загол.) | |
− | + | MOV #1750,23316 ; Число перепадов уровня при чтении (данные) | |
− | + | MOV #1750,23320 | |
− | + | CLR R0 | |
− | + | RETURN | |
; П/п установки параметров двойной плотности записи | ; П/п установки параметров двойной плотности записи | ||
− | 126632$:MOV #150,23304 | + | 126632$:MOV #150,23304 ; Длина бита "0" |
− | + | MOV #64,23306 ; Длина бита "1" | |
− | + | NOP | |
− | + | MOV #3720,23320 | |
− | + | CLR R0 | |
− | + | RETURN | |
; П/п записи блока данных на магнитную ленту | ; П/п записи блока данных на магнитную ленту | ||
− | 126662$:MOV SP,23332 | + | 126662$:MOV SP,23332 ; Сохранить значение указателя стека |
− | + | MOV 23360,R4 ; R4 = адрес буфера в ОЗУ ЦП | |
− | + | CLC | |
− | + | ROR R4 | |
− | + | MOV R4,@#177010 | |
− | + | CALL 127476$ ; Подготовка и пуск программируемого таймера | |
− | + | MOV #200,R2 ; R2 = число записываемых слов | |
− | + | BR 126776$ | |
; П/п записи файла с заголовком | ; П/п записи файла с заголовком | ||
− | 126714$:MOV SP,23332 | + | 126714$:MOV SP,23332 ; Сохранить значение указателя стека |
− | + | MOV 23360,R4 ; R4 = адрес буфера в ОЗУ ЦП | |
− | + | CLC | |
− | + | ROR R4 | |
− | + | MOV R4,@#177010 | |
− | + | CALL 127476$ ; Подготовка и пуск программируемого таймера | |
− | + | CALL 127536$ ; Запись пилот-тона перед заголовком | |
− | + | CALL 127560$ ; Запись имени файла | |
− | + | MOV 23362,R0 ; R0 = число записываемых слов | |
− | + | MOV R0,R2 ; R2 = число записываемых слов | |
− | + | TST R2 ; Оно равно нулю ? | |
− | + | BEQ 127040$ | |
− | + | CALL 127602$ ; Запись числа слов в файл | |
− | + | MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП | |
− | + | CALL 127602$ ; Запись адреса буфера в файл | |
− | 126776$:CALL 127544$ | + | 126776$:CALL 127544$ ; Запись пилот-тона перед зоной данных |
− | + | CLR R4 ; Контрольная сумма = 0 | |
− | 127004$:MOV @#177014,R0 ; R0 = слово данных | + | 127004$:MOV @#177014,R0 ; R0 = слово данных |
− | + | INC @#177010 ; Переход к следующему адресу | |
− | + | ADD R0,R4 ; Подсчет контрольной суммы файла | |
− | + | ADC R4 | |
− | + | CALL 127602$ ; Запись слова данных | |
− | + | SOB R2,127004$ ; Цикл по R2 (число записываемых слов) | |
− | + | MOV R4,R0 ; R0 = контрольная сумма | |
− | + | CALL 127602$ ; Запись контрольной суммы | |
− | + | CALL 127664$ ; Запись бита "1" | |
− | 127040$:CLR R0 | + | 127040$:CLR R0 |
− | + | RETURN | |
; П/п чтения блока данных | ; П/п чтения блока данных | ||
− | 127044$:MOV SP,23332 | + | 127044$:MOV SP,23332 ; Сохранить значение указателя стека |
− | + | MOV #200,R2 ; R2 = число считываемых слов | |
− | + | MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП | |
− | + | CLC | |
− | + | ROR R0 | |
− | + | MOV R0,@#177010 | |
− | + | CALL 130020$ ; Подготовка и пуск программируемого таймера | |
− | + | CALL 130156$ ; Поиск пилот-тона перед зоной данных | |
− | + | BR 127372$ | |
; Точка входа при чтении файла с заголовком | ; Точка входа при чтении файла с заголовком | ||
− | 127102$:CLR 23330 | + | 127102$:CLR 23330 ; Признак реального чтения файла |
− | + | BR 127124$ | |
; Точка входа при чтении файла с пропуском заголовка | ; Точка входа при чтении файла с пропуском заголовка | ||
− | 127110$:CLR 23330 | + | 127110$:CLR 23330 ; Признак реального чтения файла |
− | + | BR 127140$ | |
; Точка входа при фиктивном чтении файла с заголовком | ; Точка входа при фиктивном чтении файла с заголовком | ||
− | 127116$:MOV #4,23330 | + | 127116$:MOV #4,23330 ; Признак фиктивного чтения |
− | 127124$:CLR 23326 | + | 127124$:CLR 23326 ; Признак проверки заголовка |
− | + | BR 127146$ | |
; Точка входа при фиктивном чтении файла с пропуском заголовка | ; Точка входа при фиктивном чтении файла с пропуском заголовка | ||
− | 127132$:MOV #4,23330 | + | 127132$:MOV #4,23330 ; Признак фиктивного чтения |
− | 127140$:MOV #22,23326 | + | 127140$:MOV #22,23326 ; Признак пропуска заголовка |
− | 127146$:MOV SP,23332 | + | 127146$:MOV SP,23332 ; Сохранить значение указателя стека |
− | + | CALL 130020$ ; Подготовка и пуск программируемого таймера | |
− | + | CALL 130060$ ; Поиск пилот-тона перед заголовком | |
− | + | CALL 130254$ ; Автоподстройка по пилот-тону | |
− | + | CALL 130372$ ; Чтение заголовка | |
− | + | BIT #1,R1 ; Тип устройства ? | |
− | + | BEQ 127220$ ; MSX | |
− | + | CALL 130436$ ; Чтение длины файла в словах | |
− | + | MOV R0,23406 ; Сохранить ее в МП | |
− | + | CALL 130436$ ; Чтение адреса загрузки файла | |
− | + | MOV R0,23404 ; Сохранить его в МП | |
− | 127220$:MOV 23320 | + | 127220$:MOV 23320,R3 |
− | + | ADD 23326,PC ; Пропустить проверку заголовка (на 127252$)? | |
− | + | MOV #10,R2 ; R2 = длина заголовка в словах | |
− | + | MOV #23364,R4 ; R4 = адрес прочитанного заголовка | |
− | + | MOV #23340,R0 ; R0 = адрес заданного заголовка | |
− | 127244$:CMP (R0)+,(R4)+ ; Цикл сравнения | + | 127244$:CMP (R0)+,(R4)+ ; Цикл сравнения |
− | + | BNE 127462$ ; Не равны | |
− | + | SOB R2,127244$ | |
− | 127252$:BIT #1,R1 | + | 127252$:BIT #1,R1 ; Тип устройства ? |
− | + | BNE 127312 ; УКНЦ | |
− | + | MOV #200,R2 ; R2 = число записываемых слов | |
− | + | MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП | |
− | + | CLC | |
− | + | ROR R0 | |
− | + | MOV R0,@#177010 | |
− | + | MOV #10,R3 | |
− | + | CALL 130156$ ; Поиск пилот-тона перед зоной данных | |
− | + | BR 127372$ | |
− | 127312$:MOV 23362 | + | 127312$:MOV 23362,R0 ; R0 = число считываемых слов |
− | + | TST R0 ; Оно превышает 32767 ? | |
− | + | BMI 127330$ ; Да | |
− | + | CMP 23406,R0 ; Число запрошенных слов превышает длину файла? | |
− | + | BHI 127334$ ; Нет | |
− | 127330$:MOV 23406 | + | 127330$:MOV 23406,R0 ; Используем длину файла |
− | 127334$:MOV R0,R2 | + | 127334$:MOV R0,R2 ; R2 = число считываемых слов |
− | + | MOV 23404,23410 | |
− | + | MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП | |
− | + | CLC | |
− | + | ROR R0 | |
− | + | BCC 127366$ ; Четный адрес | |
− | + | MOV 23404,R0 ; Используется считанный адрес | |
− | + | CLC | |
− | + | ROR R0 | |
− | 127366$:MOV R0,@#177010 | + | 127366$:MOV R0,@#177010 |
− | 127372$:TST R2 | + | 127372$:TST R2 ; Число считываемых слов равно нулю ? |
− | + | BEQ 127452$ ; Да | |
− | + | CLR R4 ; Контрольная сумма = 0 | |
− | + | CALL 130336$ ; Поиск и чтение первого слова данных | |
− | + | BR 127412$ | |
− | 127406$:CALL 130436$ | + | 127406$:CALL 130436$ ; Чтение слова |
− | 127412$:ADD 23330 | + | 127412$:ADD 23330,PC ; Фиктивное чтение (на 127422$) ? |
− | + | MOV R0,@#177014 ; Пересылка в ОЗУ ЦП | |
− | 127422$:INC @#177010 ; Переход к следующему адресу | + | 127422$:INC @#177010 ; Переход к следующему адресу |
− | + | ADD R0,R4 ; Подсчет контрольной суммы | |
− | + | ADC R4 | |
− | + | SOB R2,127406$ | |
− | + | BIT #1,R1 ; Тип устройства | |
− | + | BEQ 127452$ ; MSX | |
− | + | CALL 130436$ ; Чтение контрольной суммы | |
− | + | CMP R0,R4 ; Считанная КС равна подсчитанной ? | |
− | + | BNE 127470$ | |
− | 127452$:CLR R0 | + | 127452$:CLR R0 |
− | 127454$:MTPS #200 | + | 127454$:MTPS #200 |
− | + | RETURN | |
− | 127462$:MOV #1,R0 | + | 127462$:MOV #1,R0 ; R0 = не совпадает заголовок |
− | + | BR 127454$ | |
− | 127470$:MOV #12,R0 | + | 127470$:MOV #12,R0 ; R0 = не совпадает контрольная сумма |
− | + | BR 127454$ | |
; П/п начальной подготовки перед записью | ; П/п начальной подготовки перед записью | ||
− | 127476$:BIC #14,@#177716 ; Блокировка приема информации с МЛ | + | 127476$:BIC #14,@#177716 ; Блокировка приема информации с МЛ |
− | + | CLR @#177712 ; Очистить счетчик прогр. таймера | |
− | 127510$:TST @#177714 ; Счетчик очищен ? | + | 127510$:TST @#177714 ; Счетчик очищен ? |
− | + | BNE 127510$ ; Нет | |
− | + | MOV #101,@#177710 ; Пуск таймера и разрешение прерываний | |
− | + | MOV #4,R3 ; R3 = число записываемых импульсов | |
− | + | MTPS #0 ; Разрешить прерывания | |
− | + | RETURN | |
; Точка входа при записи пилот-тона перед заголовком | ; Точка входа при записи пилот-тона перед заголовком | ||
− | 127536$:MOV 23310 | + | 127536$:MOV 23310,R4 ; R4 = число битов "1" в пилот-тоне |
− | + | BR 127550$ | |
− | 127544$:MOV 23312 | + | 127544$:MOV 23312,R4 ; R4 = число "1" в пилот-тоне перед данными |
− | 127550$:CALL 127664$ | + | 127550$:CALL 127664$ ; Запись бита "1" |
− | + | SOB R4,127550$ ; Цикл по R4 | |
− | + | RETURN | |
; П/п записи имени файла | ; П/п записи имени файла | ||
− | 127560$:MOV #10,R2 | + | 127560$:MOV #10,R2 ; R2 = размер имени файла в словах |
− | + | MOV #23340,R4 ; R4 = адрес начала имени файла | |
− | 127570$:MOV (R4)+,R0 ; R0 = очередное слово из имени файла | + | 127570$:MOV (R4)+,R0 ; R0 = очередное слово из имени файла |
− | + | CALL 127602$ ; Запись слова | |
− | + | SOB R2,127570$ ; Цикл по R2 | |
− | + | RETURN | |
; П/п записи слова на МЛ | ; П/п записи слова на МЛ | ||
− | 127602$:CALL 127616$ | + | 127602$:CALL 127616$ ; Запись младшего байта |
− | + | SWAB R0 | |
− | + | CALL 127616$ ; Запись старшего байта | |
− | + | RETURN | |
; П/п записи байта на МЛ | ; П/п записи байта на МЛ | ||
; /-----------------------------------------------------------------\ | ; /-----------------------------------------------------------------\ | ||
Line 442: | Line 443: | ||
; ! бит "0", информационные биты (0) -- (7), бит "1", бит "1" ! | ; ! бит "0", информационные биты (0) -- (7), бит "1", бит "1" ! | ||
; \-----------------------------------------------------------------/ | ; \-----------------------------------------------------------------/ | ||
− | 127616$:CALL 127660$ | + | 127616$:CALL 127660$ ; Запись бита "0" |
− | + | SEC ; Признак окончания байта | |
− | 127624$:RORB R0 | + | 127624$:RORB R0 ; Выдвинуть очередной бит |
− | + | BEQ 127646$ ; Байт окончился | |
− | + | BCC 127640$ ; Выдвинут бит "0" | |
− | + | CALL 127664$ ; Запись бита "1" | |
− | + | BR 127624$ | |
− | 127640$:CALL 127660$ | + | 127640$:CALL 127660$ ; Запись бита "0" |
− | + | BR 127624$ | |
− | 127646$:CALL 127664$ | + | 127646$:CALL 127664$ ; Запись концевика (два бита "1") |
− | + | CALL 127664$ | |
− | + | RETURN | |
; Точка входа при записи бита "0" | ; Точка входа при записи бита "0" | ||
− | 127660$:CLR R5 | + | 127660$:CLR R5 ; Признак записи бита "0" |
− | + | BR 127670$ | |
; Точка входа при записи бита "1" | ; Точка входа при записи бита "1" | ||
− | 127664$:MOV #14,R5 | + | 127664$:MOV #14,R5 ; Признак записи бита "1" |
− | 127670$:CALL 130636$ | + | 127670$:CALL 130636$ ; Проверка нажатия "СТОП" |
− | + | TST R3 ; Запись бита окончена ? | |
− | + | BNE 127670$ ; Нет | |
− | + | ADD R5,PC ; Если запись "1", на 127716$ | |
− | + | MOV 23304,@#177712 ; Занести длительность "0" в буфер таймера | |
− | + | MOV #2,R3 ; R3 = число записываемых импульсов | |
− | + | BR 127730$ | |
− | 127716$:MOV 23306 | + | 127716$:MOV 23306,@#177712 ; Занести длительность "1" в буфер таймера |
− | + | MOV #4,R3 ; R3 = число записываемых импульсов | |
127730$:CLC | 127730$:CLC | ||
− | + | RETURN | |
; П/п обработки прерывания от программируемого таймера | ; П/п обработки прерывания от программируемого таймера | ||
− | 127734$:BIS #2,@#177716 ; Установить высокий уровень при записи на МЛ | + | 127734$:BIS #2,@#177716 ; Установить высокий уровень при записи на МЛ |
− | + | MOV #127752$,@#304 ; Новое значения вектора прерывания | |
− | + | BR 127766$ | |
− | 127752$:BIC #2,@#177716 ; Установить низкий уровень при записи на МЛ | + | 127752$:BIC #2,@#177716 ; Установить низкий уровень при записи на МЛ |
− | + | MOV #127734$,@#304 ; Новое значение вектора прерывания | |
− | 127766$:TST @#177714 ; Сбросить готовность таймера | + | 127766$:TST @#177714 ; Сбросить готовность таймера |
− | + | TSTB @#177710 ; Готовность сброшена ? | |
− | + | BMI 127766$ ; Нет | |
− | + | DEC R3 ; Уменьшить счетчик записываемых импульсов | |
− | + | BMI 130006$ ; Он отрицательный | |
− | + | RTI | |
− | 130006$:MOV #14,R0 | + | 130006$:MOV #14,R0 ; R0 = ошибка выдержки времени при записи |
− | + | MOV 23332,SP | |
− | + | RETURN | |
; П/п начальной подготовки перед чтением | ; П/п начальной подготовки перед чтением | ||
− | 130020$:CLR @#177710 ; Остановить программируемый таймер | + | 130020$:CLR @#177710 ; Остановить программируемый таймер |
− | + | MOV 23336,R1 ; R1 = тип устройства (УКНЦ или MSX) | |
− | + | CLR @#177712 ; Очистить буфер таймера | |
− | 130034$:TST @#177714 ; Буфер очищен ? | + | 130034$:TST @#177714 ; Буфер очищен ? |
− | + | BNE 130034$ ; Нет | |
− | + | BIS #14,@#177716 ; Разрешить прием информации с МЛ | |
− | + | MOV #21,@#177710 ; Пуск таймера и разрешение прерывания при | |
− | + | ; изменении информации на линии МЛ | |
− | + | RETURN | |
; П/п поиска пилот-тона перед заголовком | ; П/п поиска пилот-тона перед заголовком | ||
− | 130060$:MTPS #200 | + | 130060$:MTPS #200 ; Запретить прерывания |
− | 130064$:MOV 23314 | + | 130064$:MOV 23314,R2 ; R2 = число перепадов уровня при поиске загол. |
− | 130070$:MOV R5,R4 | + | 130070$:MOV R5,R4 ; R4 = длина предыдущего интервала |
− | 130072$:CALL 130636$ | + | 130072$:CALL 130636$ ; Проверка нажатия "СТОП" |
− | + | BIT #40,@#177710 ; Перепад произошел ? | |
− | + | BEQ 130072$ ; Нет | |
− | + | MOV @#177714,R5 ; R5 = длина текущего интервала | |
− | 130112$:TST @#177714 ; Сбросить готовность таймера | + | 130112$:TST @#177714 ; Сбросить готовность таймера |
− | + | BIT #250,@#177710 ; Готовность сброшена ? | |
− | + | BNE 130112$ ; Нет | |
− | + | SUB R5,R4 ; Вычислить разность между длинами интервалов | |
− | + | BPL 130134$ | |
− | + | NEG R4 | |
− | 130134$:CMP R4,23322 | + | 130134$:CMP R4,23322 ; Разброс длин в норме ? |
− | + | BHI 130064$ ; Нет | |
− | + | SOB R2,130070$ ; Цикл по R2 | |
− | + | MOV #10,R3 | |
− | + | MTPS #0 | |
− | + | RETURN | |
; П/п поиска пилот-тона перед зоной данных | ; П/п поиска пилот-тона перед зоной данных | ||
− | 130156$:MTPS #200 | + | 130156$:MTPS #200 ; Запретить прерывания |
− | 130162$:MOV 23316 | + | 130162$:MOV 23316,R0 ; R0 = число перепадов уровня при поиске загол. |
− | 130166$:MOV R5,R4 | + | 130166$:MOV R5,R4 ; R4 = длина предыдущего интервала |
− | 130170$:CALL 130636$ | + | 130170$:CALL 130636$ ; Проверка нажатия "СТОП" |
− | + | BIT #40,@#177710 ; Перепад произошел ? | |
− | + | BEQ 130170$ ; Нет | |
− | + | MOV @#177714,R5 ; R5 = длина текущего интервала | |
− | 130210$:TST @#177714 ; Сбросить готовность таймера | + | 130210$:TST @#177714 ; Сбросить готовность таймера |
− | + | BIT #250,@#177710 ; Готовность сброшена ? | |
− | + | BNE 130210$ ; Нет | |
− | + | SUB R5,R4 ; Вычислить разность между длинами интервалов | |
− | + | BPL 130232$ | |
− | + | NEG R4 | |
− | 130232$:CMP R4,23322 | + | 130232$:CMP R4,23322 ; Разброс длин в норме ? |
− | + | BHI 130162$ ; Нет | |
− | + | SOB R0,130166$ ; Цикл по R0 | |
− | + | MOV #10,R3 | |
− | + | MTPS #0 | |
− | + | RETURN | |
; П/п вычисления усредненного значения длины бита (между "0" и "1") | ; П/п вычисления усредненного значения длины бита (между "0" и "1") | ||
− | 130254$:MOV R1,R4 | + | 130254$:MOV R1,R4 ; Сохранить значение R1 в R4 |
− | + | MOV #10,R0 ; R0 = число читаемых импульсов | |
− | + | CLR R1 | |
− | + | CLR R3 | |
− | 130266$:CALL 130530$ | + | 130266$:CALL 130530$ ; Чтение бита |
− | + | BIS #170000,R5 ; Преобразование в отрицательное число | |
− | + | SUB R5,R1 ; Прибавить к общей длине | |
− | + | SOB R0,130266$ ; Цикл по R0 | |
− | + | MOV #10,R3 | |
− | + | DIV #10,R0 ; Вычисление среднего значения длины "1" | |
− | + | MOV R0,R1 ; R1 = длина "1" | |
− | + | ASR R0 ; R0 = длина "1" / 2 | |
− | + | ADD R1,R0 ; R0 = среднее между длиной "1" и "0" | |
− | + | NEG R0 ; Преобразование в отрицательное число (12 бит) | |
− | + | BIC #170000,R0 | |
− | + | MOV R0,23324 ; Сохранение его в памяти | |
− | + | MOV R4,R1 ; Восстановление R1 | |
− | + | RETURN | |
; П/п поиска данных (определяются по биту "0") | ; П/п поиска данных (определяются по биту "0") | ||
− | 130336$:CLR R5 | + | 130336$:CLR R5 ; Очередной бит не прочитан |
− | 130340$:CALL 130636$ | + | 130340$:CALL 130636$ ; Проверка нажатия "СТОП" |
− | + | TST R5 ; Бит прочитан ? | |
− | + | BEQ 130340$ ; Нет | |
− | + | INC R3 ; Увеличить счетчик импульсов | |
− | + | CMP R5,23324 ; Это бит "0" ? | |
− | + | BHIS 130336$ ; Нет | |
− | + | INC R3 | |
− | + | INC R3 | |
− | + | CALL 130422$ ; Дочитать слово | |
− | + | RETURN | |
; П/п чтения имени файла | ; П/п чтения имени файла | ||
− | 130372$:MOV #10,R2 | + | 130372$:MOV #10,R2 ; R2 = длина имени файла в словах |
− | + | MOV #23364,R4 ; R4 = адрес буфера | |
− | + | CALL 130336$ ; Поиск и чтение первого слова | |
− | + | BR 130414$ | |
− | 130410$:CALL 130436$ | + | 130410$:CALL 130436$ ; Чтение очередного слова |
− | 130414$:MOV R0,(R4)+ ; Поместить в буфер | + | 130414$:MOV R0,(R4)+ ; Поместить в буфер |
− | + | SOB R2,130410$ ; Цикл по R2 | |
− | + | RETURN | |
; П/п дочитывания слова | ; П/п дочитывания слова | ||
− | 130422$:CLRB R0 | + | 130422$:CLRB R0 |
− | + | BIS #200,R0 ; Признак окончания чтения байта | |
− | + | CALL 130470$ ; Дочитать байт | |
− | + | BR 130442$ | |
; П/п чтения слова | ; П/п чтения слова | ||
− | 130436$:CALL 130454$ | + | 130436$:CALL 130454$ ; Прочесть младший байт |
− | 130442$:SWAB R0 | + | 130442$:SWAB R0 |
− | + | CALL 130454$ ; Прочесть старший байт | |
− | + | SWAB R0 | |
− | + | RETURN | |
; П/п чтения байта | ; П/п чтения байта | ||
− | 130454$:CLRB R0 | + | 130454$:CLRB R0 |
− | + | BIS #200,R0 ; Установить признак окончания | |
− | + | CALL 130530$ ; Прочесть бит | |
− | + | BCS 130516$ ; Это не "0" (ошибка) | |
− | 130470$:CALL 130530$ | + | 130470$:CALL 130530$ ; Прочесть бит |
− | + | RORB R0 ; "Задвинуть" бит | |
− | + | BCC 130470$ ; Пока не конец | |
− | + | CALL 130530$ ; Прочесть бит | |
− | + | BCC 130516$ ; Это не "1" (ошибка) | |
− | + | CALL 130530$ ; Прочесть бит | |
− | + | BCC 130516$ ; Это не "1" (ошибка) | |
− | + | RETURN | |
− | 130516$:MOV #11,R0 | + | 130516$:MOV #11,R0 ; R0 = ошибка чтения |
− | + | MOV 23332,SP | |
− | + | RETURN | |
; П/п чтения бита | ; П/п чтения бита | ||
− | 130530$:CLR R5 | + | 130530$:CLR R5 ; Бит еще не прочитан |
− | 130532$:CALL 130636$ | + | 130532$:CALL 130636$ ; Проверка нажатия "СТОП" |
− | + | TST R5 ; Бит прочитан ? | |
− | + | BEQ 130532$ ; Нет | |
− | + | CMP R5,23324 ; Это "0" ? | |
− | + | BLO 130560$ ; Да | |
− | + | MOV #3,R3 | |
− | + | SEC ; Признак бита "1" | |
− | + | BR 130566$ | |
− | 130560$:MOV #1,R3 | + | 130560$:MOV #1,R3 |
− | + | CLC ; Признак бита "0" | |
130566$:RETURN | 130566$:RETURN | ||
; П/п обработки прерывания по линии МЛ при изменении уровня сигнала | ; П/п обработки прерывания по линии МЛ при изменении уровня сигнала | ||
− | 130570$:TST R3 | + | 130570$:TST R3 ; Счетчик равен нулю ? |
− | + | BNE 130604$ ; Нет | |
− | + | TST R5 ; Обработка предыдущего бита окончена ? | |
− | + | BNE 130624$ ; Нет | |
− | + | MOV @#177714,R5 ; R5 = длина импульса | |
− | 130604$:TST @#177714 ; Сбросить готовность таймера | + | 130604$:TST @#177714 ; Сбросить готовность таймера |
− | + | BIT #250,@#177710 ; Готовность сброшена ? | |
− | + | BNE 130604$ ; Нет | |
− | + | DEC R3 ; Уменьшить счетчик импульсов | |
− | + | RTI | |
− | 130624$:MOV #13,R0 | + | 130624$:MOV #13,R0 ; R0 = ошибка выдержки времени при чтении |
− | + | MOV 23332,SP | |
− | + | RETURN | |
; П/п проверки нажатия клавиши "СТОП" | ; П/п проверки нажатия клавиши "СТОП" | ||
− | 130636$:TSTB @#177700 ; Клавиша нажата ? | + | 130636$:TSTB @#177700 ; Клавиша нажата ? |
− | + | BPL 130670$ ; Нет | |
− | + | CMP #4,@#177702 ; Это "СТОП" ? | |
− | + | BNE 130670$ ; Нет | |
− | + | MOV 23332,SP | |
− | + | MOV #377,R0 ; R0 = нажата клавиша "СТОП" | |
− | + | MTPS #200 ; Запретить прерывания | |
130670$:RETURN | 130670$:RETURN | ||
; П/п выключения программируемого таймера | ; П/п выключения программируемого таймера | ||
− | 130672$:CLR @#177710 ; Выключить таймер (режим "ОСТАНОВ") | + | 130672$:CLR @#177710 ; Выключить таймер (режим "ОСТАНОВ") |
− | + | TST @#177714 ; Сбросить готовность таймера | |
− | + | TST @#177710 ; Готовность сброшена ? | |
− | + | BNE 130672$ ; Нет | |
− | + | RETURN | |
; *** ДИСКОВОД *** | ; *** ДИСКОВОД *** | ||
; П/п установки начальных значений | ; П/п установки начальных значений | ||
− | 130712$:TST @#177132 ; Проверка присутствия контроллера дисковода | + | 130712$:TST @#177132 ; Проверка присутствия контроллера дисковода |
− | + | CLR 23204 ; Очистить управляющее слово | |
− | + | MOV 23204,@#177130 ; Инициализация контроллера | |
− | + | CLRB 23334 | |
− | + | CLR 23220 | |
− | + | CLR 23222 | |
− | + | BIT #10000,@#177704 ; Подключен 80-дорожечный дисковод ? | |
− | + | BEQ 131030$ ; Нет | |
; Параметры для 80-дорожечного дисковода | ; Параметры для 80-дорожечного дисковода | ||
− | + | MOV #620,23216 ; Время разгона двигателя | |
− | + | MOV #23260,R1 ; R1 = адрес буфера времен шага | |
− | + | MOV #3,R0 ; R0 = время шага | |
− | + | CALL 131164$ ; Установить для всех четырех накопителей | |
− | + | MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки | |
− | + | MOV #44,R0 ; R0 = время загрузки головки | |
− | + | CALL 131164$ ; Установить для всех четырех накопителей | |
− | + | MOVB #50,23226 ; Номер дорожки, где вкл. прекоррекция 250 нс | |
− | + | MOVB #120,23227 ; Номер дорожки, где вкл. прекоррекция 500 нс | |
− | + | BR 131102$ | |
; Параметры для 40-дорожечного дисковода | ; Параметры для 40-дорожечного дисковода | ||
− | 131030$:MOV #1750,23216 | + | 131030$:MOV #1750,23216 ; Время разгона двигателя |
− | + | MOV #23260,R1 ; R1 = адрес буфера времен шага | |
− | + | MOV #24,R0 ; R0 = время шага | |
− | + | CALL 131164$ ; Установить для всех четырех накопителей | |
− | + | MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки | |
− | + | MOV #50,R0 ; R0 = время загрузки головки | |
− | + | CALL 131164$ ; Установить для всех четырех накопителей | |
− | + | MOVB #10,23226 ; Номер дорожки, где вкл. прекоррекция 250 нс | |
− | + | MOVB #36,23227 ; Номер дорожки, где вкл. прекоррекция 500 нс | |
− | 131102$:MOV #23270,R1 ; R1 = адрес буфера числа секторов в дорожке | + | 131102$:MOV #23270,R1 ; R1 = адрес буфера числа секторов в дорожке |
− | + | MOV #12,R0 ; R0 = число секторов в дорожке | |
− | + | CALL 131164$ ; Установить для всех четырех накопителей | |
− | + | MOV #23274,R1 ; R1 = адрес буфера параметров SKIP (REGIM) | |
− | + | MOV #1,R0 ; R0 = параметр SKIP | |
− | + | CALL 131164$ ; Установить для всех четырех накопителей | |
− | + | MOV #2,23250 ; Текущий формат сектора - 512 байт | |
− | + | MOV #-1,23337 | |
− | + | MOV #-1,23254 ; Неопределенный номер текущих дорожек | |
− | + | MOV #-1,23256 | |
− | + | RETURN | |
− | 131164$:MOV #4,R2 | + | 131164$:MOV #4,R2 ; R2 = максимальное число накопителей |
− | 131170$:MOVB R0,(R1)+ ; Установить параметр | + | 131170$:MOVB R0,(R1)+ ; Установить параметр |
− | + | SOB R2,131170$ | |
− | + | RETURN | |
; Основная п/п управления накопителем | ; Основная п/п управления накопителем | ||
− | 131176$:JSR R5,125560$ ; Чтение МП | + | 131176$:JSR R5,125560$ ; Чтение МП |
− | + | .WORD 5 | |
− | + | CALL 176376$ ; Останов программируемого таймера | |
− | + | JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п | |
− | + | .WORD 10,131224$,107 ; по адресу 131224$ | |
− | + | RETURN | |
− | 131224$:CALL 134242$ | + | 131224$:CALL 134242$ ; Сброс готовности программируемого таймера |
− | + | CLRB @#177710 ; Перевести таймер в режим "ОСТАНОВ" | |
− | + | CALL 134316$ ; Сохранить значения РОН | |
− | + | BIC #175754,23204 ; Сброс в УС прекоррекции,номера стороны ... | |
− | + | BICB #300,23335 ; Очистка старших битов кода функции | |
− | + | BEQ 131516$ ; Код функции = 0 (ошибка) | |
− | + | CMPB #10,23335 ; Код функции >= 10(8) ? | |
− | + | BLOS 131272$ ; Да | |
− | + | JMP 135214$ ; Код функции в пределе 1 -- 7 | |
− | 131272$:TSTB 23337 | + | 131272$:TSTB 23337 ; Какая сторона запрошена ? |
− | + | BPL 131316$ ; Низ | |
− | + | BIS #40,23204 ; Установить "ВЕРХ" в УС | |
− | + | MOVB #1,23212 ; Текущая сторона - верх | |
− | + | BR 131330$ | |
− | 131316$:BIC #40,23204 | + | 131316$:BIC #40,23204 ; Установить "НИЗ" в УС |
− | + | CLRB 23212 ; Текущая сторона - низ | |
− | 131330$:BICB #374,23337 | + | 131330$:BICB #374,23337 ; Оставить биты номера устройства |
− | + | MOVB 23340,23213 ; Переслать номер запрашиваемой дорожки | |
− | + | CLR R1 | |
− | + | MOVB 23337,R1 ; R1 = номер устройства | |
− | + | MOVB 23260(R1),23220 ; Текущее время шага | |
− | + | MOVB 23264(R1),23222 ; Текущее время загрузки головки | |
− | + | MOVB 23274(R1),23300 ; Текущий параметр SKIP | |
− | + | MOVB 23270(R1),23301 ; Текущее число секторов в дорожке | |
− | + | TSTB 23341 ; Номер запрашиваемого сектора отрицательный ? | |
− | + | BMI 131516$ ; Да | |
− | + | CMPB 23341,23301 ; Номер сектора превышает лимит ? | |
− | + | BHI 131516$ ; Да | |
− | + | CMPB #5,23301 ; В дорожке 5 секторов ? | |
− | + | BEQ 131440$ ; Да | |
− | + | MOV #2,23250 ; Текущий формат сектора - 512 байт | |
− | + | BR 131446$ | |
− | 131440$:MOV #3,23250 | + | 131440$:MOV #3,23250 ; Текущий формат сектора - 1024 байт |
− | 131446$:MOV 23250 | + | 131446$:MOV 23250,R0 ; R0 = текущий формат сектора |
− | + | MOVB 135426$(R0),23302; (23302) = размер межсекторного промежутка | |
− | + | ASL R0 | |
− | + | MOV 135412$(R0),23252; (23252) = число слов в секторе | |
− | + | CMPB #30,23335 ; Код функции < 30 | |
− | + | BHI 131502$ ; Да | |
− | + | BR 131542$ | |
− | 131502$:CLC | + | 131502$:CLC ; Преобразование адреса для загрузки в 177010 |
− | + | ROR 23342 | |
− | + | MOV 23344,R0 ; R0 = число слов для чтения | |
− | + | BPL 131530$ ; Оно < 32768 (в норме) | |
− | 131516$:MOVB #11,23334 | + | 131516$:MOVB #11,23334 ; Ошибочный массив параметров |
− | + | JMP 134422$ | |
− | 131530$:ADD 23342 | + | 131530$:ADD 23342,R0 ; R0 = число слов + начальный адрес |
− | + | CMP #70000,R0 ; Конец буфера выходит за границу 56 KB ? | |
− | + | BLO 131516$ ; Да | |
− | 131542$:MOVB 23337 | + | 131542$:MOVB 23337,R1 ; R1 = номер устройства |
− | + | MOV R1,23206 | |
− | + | ADD #23254,23206 ; (23206) = указатель на текущую дорожку | |
− | + | JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п | |
− | + | .WORD 101,131710$,107 ; по адресу 131710$ | |
− | + | BIT #2000,23204 ; Двигатель накопителя еще работает ? | |
− | + | BNE 131620$ ; Да | |
− | + | BIS #20,23204 ; Установить бит запуска мотора в УС | |
− | + | MOV 23216,23224 ; (23224) = время разгона двигателя | |
− | + | BR 131652$ | |
− | 131620$:MOVB 23204 | + | 131620$:MOVB 23204,R0 |
− | + | BICB #374,R0 ; R0 = номер выбранного устройства | |
− | + | CMPB 135406$(R1),R0 ; Номера выбранного и запрошенного уст-в равны? | |
− | + | BNE 131644$ ; Нет | |
− | + | CALL 134356$ ; Восстановить РОН | |
− | + | BR 131726$ | |
− | 131644$:MOV 23222 | + | 131644$:MOV 23222,23224 ; (23224) = время загрузки головки |
− | 131652$:BIC #3,23204 | + | 131652$:BIC #3,23204 |
− | + | BISB 135406$(R1),23204; Установить биты номера устройства в УС | |
− | + | BIS #2000,23204 ; Установить бит выбора накопителя | |
− | + | MOV 23204,@#177130 ; Запуск мотора | |
− | + | CALL 134356$ ; Восстановить РОН | |
− | + | RTI | |
− | 131710$:CALL 134242$ | + | 131710$:CALL 134242$ ; Сброс готовности программируемого таймера |
− | + | DEC 23224 ; Уменьшить значение счетчика (разгон мотора) | |
− | + | BNE 131724$ ; Он еще не равен нулю | |
− | + | BR 131726$ | |
131724$:RTI | 131724$:RTI | ||
− | 131726$:JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п | + | 131726$:JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п |
− | + | .WORD 101,132074$,107 ; по адресу 132074$ | |
− | + | TSTB @23206 ; Текущий номер дорожки определенный ? | |
− | + | BPL 132112$ ; Да | |
− | + | MOVB #200,@23206 ; Примем в качестве номера дорожки - 128 | |
− | + | BIC #100,23204 ; Установить в УС перемещение от центра | |
− | + | MOV 23204,@#177130 ; Сообщить об этом контроллеру | |
− | + | BIS #200,23204 ; Установить в УС бит шага | |
− | 131776$:BIT #1,@#177130 ; Головка находится на нулевой дорожке ? | + | 131776$:BIT #1,@#177130 ; Головка находится на нулевой дорожке ? |
− | + | BEQ 132022$ ; Нет | |
− | + | BIC #200,23204 ; Сбросить в УС бит шага | |
− | + | CLRB @23206 ; Текущая дорожка - нулевая | |
− | + | BR 132112$ | |
− | 132022$:DECB @23206 | + | 132022$:DECB @23206 ; Уменьшить номер текущей дорожки |
− | + | BNE 132056$ ; Пока не 0 | |
− | + | BIC #200,23204 ; Сбросить в УС бит шага | |
− | + | MOVB #377,@23206 ; Номер дорожки - неопределенный | |
− | + | MOVB #7,23334 ; Ошибка - нулевая дорожка не обнаружена | |
− | + | JMP 134422$ | |
− | 132056$:MOV 23204 | + | 132056$:MOV 23204,@#177130 ; Сделать шаг назад |
− | + | MOV 23220,23224 ; (23224) = время шага | |
− | + | RTI | |
− | 132074$:CALL 134242$ | + | 132074$:CALL 134242$ ; Сбросить готовность программируемого таймера |
− | + | DEC 23224 ; Уменьшить значение счетчика (время шага) | |
− | + | BNE 132110$ ; Он не равен нулю | |
− | + | BR 131776$ | |
132110$:RTI | 132110$:RTI | ||
− | 132112$:CMPB @23206 | + | 132112$:CMPB @23206,23340 ; Сравнить номера текущей и запрошенной дорожек |
− | + | BEQ 132346$ ; Равны | |
− | + | BHI 132164$ ; Больше | |
− | + | INCB @23206 ; Увеличить номер текущей дорожки | |
− | + | BMI 132152$ ; Он > 127 (ошибка) | |
− | + | BIT #100,23204 ; В УС установлен бит перемещения к центру | |
− | + | BNE 132246$ ; Да | |
− | + | BIS #100,23204 ; Установить в УС бит перемещения к центру | |
− | + | BR 132224$ | |
− | 132152$:MOVB #10,23334 | + | 132152$:MOVB #10,23334 ; Ошибка - дорожка не обнаружена |
− | + | JMP 134422$ | |
− | 132164$:DECB @23206 | + | 132164$:DECB @23206 ; Уменьшить номер текущей дорожки |
− | + | BIT #1,@#177130 ; Головка находится на нулевой дорожке ? | |
− | + | BEQ 132206$ ; Нет | |
− | + | CLRB @23206 ; Текущая дорожка - нулевая | |
− | + | BR 132112$ | |
− | 132206$:BIT #100,23204 | + | 132206$:BIT #100,23204 ; В УС сброшен бит перемещения |
− | + | BEQ 132246$ ; Да | |
− | + | BIC #100,23204 ; Сбросить в УС бит перемещения | |
− | 132224$:MOV 23204 | + | 132224$:MOV 23204,@#177130 ; Извещение контроллера о направлении перемещ. |
− | + | MOV #132242$,@#304 ; Адрес новой п/п обработки прерывания | |
− | + | RTI | |
− | 132242$:CALL 134242$ | + | 132242$:CALL 134242$ ; Сбросить готовность программируемого таймера |
− | 132246$:MOVB 23300 | + | 132246$:MOVB 23300,23246 ; (23246) = текущий параметр SKIP |
− | 132254$:MOV 23220 | + | 132254$:MOV 23220,23224 ; (23224) = время шага |
− | + | MOV #132322$,@#304 ; Адрес новой п/п обработки прерывания | |
− | + | CALL 132276$ ; Выполнить шаг в выбранном направлении | |
− | + | RTI | |
− | 132276$:BIS #200,23204 | + | 132276$:BIS #200,23204 ; Установить в УС бит шага |
− | + | MOV 23204,@#177130 ; Выполнить шаг | |
− | + | BIC #200,23204 ; Сбросить в УС бит шага | |
− | + | RETURN | |
− | 132322$:CALL 134242$ | + | 132322$:CALL 134242$ ; Сбросить готовность программируемого таймера |
− | + | DEC 23224 ; Уменьшить значение счетчика (время шага) | |
− | + | BNE 132344$ ; Он не равен нулю | |
− | + | DECB 23246 ; Уменьшить параметр пропуска дорожки | |
− | + | BNE 132254$ ; Не равен нулю | |
− | + | BR 132112$ | |
132344$:RTI | 132344$:RTI | ||
− | 132346$:BIC #14,23204 | + | 132346$:BIC #14,23204 ; Очистить в УС биты прекоррекции |
− | + | MOV 23226,23246 ; (23246) = номера дорожек, где вкл. прекорр. | |
− | + | CMPB #1,23300 ; Параметр SKIP равен 1 ? | |
− | + | BEQ 132402$ ; Да | |
− | + | ASRB 23246 ; Уменьшить номера дорожек на 2 | |
− | + | ASRB 23247 | |
− | 132402$:CMPB 23246 | + | 132402$:CMPB 23246,@23206 ; Надо включать прекоррекцию ? |
− | + | BHI 132440$ ; Нет | |
− | + | CMPB 23247,@23206 ; Включать прекоррекцию 500 нс ? | |
− | + | BHI 132432$ ; Да | |
− | + | BIS #4,23204 ; Установить в УС бит вкл. прекоррекции 250 нс | |
− | + | BR 132440$ | |
− | 132432$:BIS #10,23204 | + | 132432$:BIS #10,23204 ; Установить в УС бит вкл. прекоррекции 500 нс |
− | 132440$:MOV 23204 | + | 132440$:MOV 23204,@#177130 ; Извещение контроллера о вкл. прекоррекции |
− | + | MOV #132456$,@#304 ; Адрес новой п/п обработки прерывания | |
− | + | RTI | |
− | 132456$:CALL 134242$ | + | 132456$:CALL 134242$ ; Сбросить готовность программируемого таймера |
− | + | CLRB @#177710 ; Остановить таймер | |
− | + | CALL 134316$ ; Сохранить значения РОН | |
− | + | MOV #177130,R4 ; R4 = адрес РСУ накопителя | |
− | + | MOV R4,R5 | |
− | + | TST (R5)+ ; R5 = адрес РД накопителя | |
− | + | CMPB #10,23335 ; Запрошено чтение ? | |
− | + | BEQ 132570$ ; Да | |
− | + | BIT #4,@R4 ; Дискета защищена от записи ? | |
− | + | BEQ 132532$ ; Нет | |
− | + | MOVB #6,23334 ; Ошибка - защита от записи | |
− | + | JMP 134422$ | |
− | 132532$:CMPB #20,23335 | + | 132532$:CMPB #20,23335 ; Запрошена запись ? |
− | + | BEQ 132570$ | |
− | + | CMPB #30,23335 ; Запрошено форматирование дорожки ? | |
− | + | BNE 132556$ ; Нет | |
− | + | JMP 134474$ | |
− | 132556$:MOVB #11,23334 | + | 132556$:MOVB #11,23334 ; Ошибка - неверный массив параметров |
− | + | JMP 134422$ | |
− | 132570$:MOV #36,23224 | + | 132570$:MOV #36,23224 |
− | + | MOV 23224,R2 | |
− | + | MOV 23204,R3 ; R3 = УС | |
− | + | MOV #177130,R4 ; R4 = адрес РСУ накопителя | |
− | + | MOV R4,R5 | |
− | + | TST (R5)+ ; R5 = адрес РД накопителя | |
− | + | JSR R5,134210$ ; Запуск таймера | |
− | + | .WORD 2465,132630$,7 | |
− | 132630$:MOV @R5,R0 | + | 132630$:MOV @R5,R0 ; Прочесть слово с дискеты |
− | + | BEQ 132640$ ; Это нуль | |
− | + | INC R0 | |
− | + | BNE 132656$ ; Это не минус один | |
− | 132640$:TSTB @#177710 ; Таймер окончил счет ? | + | 132640$:TSTB @#177710 ; Таймер окончил счет ? |
− | + | BPL 132630$ ; Нет | |
− | + | CALL 134242$ ; Сбросить готовность таймера | |
− | + | SOB R2,132630$ | |
− | + | BR 132772$ ; Ошибка (не форматирована дискета или ее нет) | |
− | 132656$:MOV #4,R1 | + | 132656$:MOV #4,R1 |
− | + | CMPB #5,23301 ; Формат 1024 байта в секторе ? | |
− | + | BNE 132702$ ; Нет | |
− | + | TST @R4 ; Присутствует линия индекс ? | |
− | + | BPL 132702$ ; Нет | |
− | + | MOV #36,R1 | |
− | 132702$:MOV @R5,R0 | + | 132702$:MOV @R5,R0 ; Прочесть слово с дискеты |
− | + | BEQ 132730$ ; Это нуль | |
− | + | INC R0 | |
− | + | BEQ 132730$ ; Это минус один | |
− | + | TSTB @#177710 ; Таймер окончил счет | |
− | + | BPL 132656$ ; Нет | |
− | + | CALL 134242$ ; Сбросить готовность таймера | |
− | + | SOB R2,132656$ | |
− | + | BR 133002$ ; Ошибка (не найден межсекторный промежуток) | |
− | 132730$:MOV @R5,R0 | + | 132730$:MOV @R5,R0 ; Прочесть слово с дискеты |
− | + | BEQ 132740$ ; Это нуль | |
− | + | INC R0 | |
− | + | BNE 132640$ ; Это не минус один | |
− | 132740$:SOB R1,132730$ | + | 132740$:SOB R1,132730$ |
− | + | BIS #400,R3 ; Установить в УС бит поиска заголовка | |
− | + | MOV R3,@R4 ; Начать поиск | |
− | + | BIC #400,R3 ; Сбросить в УС бит поиска заголовка | |
− | + | MOV #226,R0 ; Время ожидания поиска | |
− | + | MOV R3,@R4 | |
− | 132762$:TSTB @R4 | + | 132762$:TSTB @R4 ; Маркер заголовка обнаружен ? |
− | + | BMI 133034$ ; Да | |
− | + | SOB R0,132762$ | |
− | + | BR 132630$ ; Заголовок сектора необнаружен | |
− | 132772$:MOVB #100,23334 | + | 132772$:MOVB #100,23334 ; Ошибка - не форматирована дискета |
− | + | BR 133030$ | |
− | 133002$:MOVB #101,23334 | + | 133002$:MOVB #101,23334 ; Ошибка - не обнаружен межсекторный промежуток |
− | + | BR 133030$ | |
− | 133012$:MOVB #102,23334 | + | 133012$:MOVB #102,23334 ; Ошибка - не найден сектор с заданным номером |
− | + | BR 133030$ | |
− | 133022$:MOVB #3,23334 | + | 133022$:MOVB #3,23334 |
− | 133030$:JMP 134422$ | + | 133030$:JMP 134422$ |
− | 133034$:TST @R5 | + | 133034$:TST @R5 ; Сбросить готовность контроллера дисковода |
− | 133036$:TSTB @R4 | + | 133036$:TSTB @R4 ; Следующее слово прочитано ? |
− | + | BPL 133036$ ; Нет | |
− | + | CMP #120776,@R5 ; Это адресный маркер заголовка сектора? | |
− | + | BEQ 133212$ ; Да | |
− | + | MOV #14,R0 | |
− | 133054$:ADD 23252 | + | 133054$:ADD 23252,R0 |
− | + | ASL R0 | |
− | + | ASL R0 | |
− | 133064$:CLRB @#177710 | + | 133064$:CLRB @#177710 |
− | + | MOV R0,@#177712 ; Загрузить буфер таймера | |
− | + | CMP R0,@#177714 ; Буфер загружен ? | |
− | + | BNE 133064$ ; Нет | |
− | + | MOV #133134$,@#304 ; Адрес новой п/п обработки прерываний | |
− | + | MOVB #107,@#177710 ; Запустить таймер | |
− | + | MOV R3,23204 | |
− | + | MOV R2,23224 | |
− | + | CALL 134356$ ; Восстановить РОН | |
− | + | RTI | |
− | 133134$:CALL 134242$ | + | 133134$:CALL 134242$ ; Сбросить готовность таймера |
− | + | CALL 134316$ ; Сохранить содержимое РОН | |
− | + | DEC 23224 ; Уменьшить счетчик (число оборотов диска) | |
− | + | BLE 133012$ ; Он равен нулю (ошибка) | |
− | + | MOV #2465,@#177712 ; Загрузить буфер таймера временем оборота | |
− | + | MOV #7,@#177710 ; Перевести таймер в режим "ПУСК" (без прерыв.) | |
− | + | MOV 23224,R2 ; R2 = значение счетчика | |
− | + | MOV 23204,R3 ; R3 = УС | |
− | + | MOV #177130,R4 ; R4 = адрес РСУ накопителя | |
− | + | MOV R4,R5 | |
− | + | TST (R5)+ ; R5 = адрес РД накопителя | |
− | + | JMP 134100$ ; На поиск заголовка сектора | |
− | 133212$:TSTB @R4 | + | 133212$:TSTB @R4 ; Очередное слово сформировано ? |
− | + | BPL 133212$ ; Нет | |
− | + | MOV @R5,23246 ; Прочесть его | |
− | + | CMP 23212,23246 ; Это идентификатор стороны и дорожки ? | |
− | + | BEQ 133276$ ; Да | |
− | 133232$:TSTB @R4 | + | 133232$:TSTB @R4 ; Очередное слово сформировано ? |
− | + | BPL 133232$ ; Нет | |
− | + | TST @R5 ; Игнорировать прочитанное слово(номер сектора) | |
− | + | CALL 134300$ ; Контрольная сумма в порядке ? | |
− | + | BEQ 133270$ ; Нет | |
− | + | MOV R3,23204 ; Сохранить УС | |
− | + | CALL 134356$ ; Восстановить РОН | |
− | + | MOVB #377,@23206 ; Поставить номер неопределенной дорожки | |
− | + | JMP 131726$ | |
− | 133270$:MOV #40,R0 | + | 133270$:MOV #40,R0 |
− | + | BR 133054$ | |
− | 133276$:TSTB @R4 | + | 133276$:TSTB @R4 ; Очередное слово сформировано ? |
− | + | BPL 133276$ ; Нет | |
− | + | MOV @R5,R0 ; R0 = прочитанное слово | |
− | + | SWAB R0 | |
− | + | CMPB 23341,R0 ; Номер сектора совпадает ? | |
− | + | BNE 133270$ ; Нет | |
− | + | MOV 23344,R2 ; R2 = число слов для обмена | |
− | + | MOV 23342,@#177010 ; Адрес буфера ОЗУ ЦП | |
− | + | CALL 134300$ ; Контрольная сумма в порядке ? | |
− | + | BNE 133344$ ; Да | |
− | + | MOVB #2,23334 ; Ошибка в контрольной сумме заголовка | |
− | + | BR 133030$ | |
− | 133344$:CMPB #10,23335 | + | 133344$:CMPB #10,23335 ; Задана операция чтения ? |
− | + | BNE 133506$ ; Нет | |
− | + | TST @R5 ; Сбросить готовность контроллера | |
− | + | MOV #21,R1 | |
− | + | CALL 134132$ ; Поиск пропуска синхроимпульсов | |
− | + | BEQ 133476$ ; Не найдено | |
− | 133370$:TSTB @R4 | + | 133370$:TSTB @R4 ; Очередное слово сформировано ? |
− | + | BPL 133370$ ; Нет | |
− | + | CMP #120773,@R5 ; Это маркер данных ? | |
− | + | BNE 133476$ ; Нет | |
− | + | MOV 23252,R1 ; R1 = число слов в секторе | |
− | + | TST R2 ; Надо прочитать 0 слов ? | |
− | + | BEQ 133442$ ; Да (сделать проверку КС сектора) | |
− | 133412$:TSTB @R4 | + | 133412$:TSTB @R4 ; Очередное слово сформировано ? |
− | + | BPL 133412$ ; Нет | |
− | + | MOV @R5,R0 ; Прочитать его | |
− | + | SWAB R0 | |
− | + | MOV R0,@#177014 ; Переслать в ОЗУ ЦП | |
− | + | INC @#177010 ; Переход к следующему адресу | |
− | + | DEC R2 ; Уменьшить счетчик считываемых слов | |
− | + | BEQ 133450$ ; Все прочитали | |
− | + | SOB R1,133412$ ; Цикл по числу слов в секторе | |
− | + | BR 133452$ | |
− | 133442$:TSTB @R4 | + | 133442$:TSTB @R4 ; Очередное слово сформировано ? |
− | + | BPL 133442$ | |
− | + | TST @R5 ; Пропуск конца сектора | |
− | 133450$:SOB R1,133442$ ; Цикл по числу слов в секторе | + | 133450$:SOB R1,133442$ ; Цикл по числу слов в секторе |
− | 133452$:MOV R2,23344 | + | 133452$:MOV R2,23344 ; Сохранить число оставшихся слов |
− | + | CALL 134300$ ; Контрольная сумма в порядке ? | |
− | + | BNE 133706$ ; Да | |
− | + | MOVB #1,23334 ; Ошибка в контрольной сумме зоны данных | |
− | 133472$:JMP 133030$ | + | 133472$:JMP 133030$ |
− | 133476$:MOVB #4,23334 | + | 133476$:MOVB #4,23334 ; Не найден маркер данных |
− | + | BR 133472$ | |
− | 133506$:TST R2 | + | 133506$:TST R2 ; Счетчик записываемых слов равен нулю ? |
− | + | BNE 133516$ ; Нет | |
− | + | JMP 134416$ ; Да | |
− | 133516$:MOV #47116,@R5 ; Запись межсекторного промежутка | + | 133516$:MOV #47116,@R5 ; Запись межсекторного промежутка |
− | + | MOV #13,R0 ; R0 = размер межсекторного пром. перед данными | |
− | 133526$:TSTB @R4 | + | 133526$:TSTB @R4 ; Предыдущее слово записано ? |
− | + | BPL 133526$ ; Нет | |
− | + | MOV #47116,@R5 ; Запись межсекторного промежутка | |
− | + | SOB R0,133526$ | |
− | + | MOV #6,R0 ; R0 = размер нулевой зоны | |
− | 133544$:TSTB @R4 | + | 133544$:TSTB @R4 ; Очередное слово записано ? |
− | + | BPL 133544$ ; Нет | |
− | + | MOV #0,@R5 ; Запись нулевой зоны | |
− | + | SOB R0,133544$ | |
− | + | BIS #1000,R3 ; Установить бит пропуска синхроимпульсов | |
− | 133562$:TSTB @R4 | + | 133562$:TSTB @R4 ; Очередное слово записано ? |
− | + | BPL 133562$ ; Нет | |
− | + | MOV #120641,@R5 ; Запись первого слова маркера данных | |
− | + | MOV R3,@R4 ; Установить пропуск синхроимпульсов | |
− | + | BIC #1000,R3 ; Сбросить бит пропуска синхроимпульсов | |
− | 133600$:TSTB @R4 | + | 133600$:TSTB @R4 ; Очередное слово записано ? |
− | + | BPL 133600$ ; Нет | |
− | + | MOV #175641,@R5 ; Запись второго слова маркера данных | |
− | + | MOV 23252,R1 ; R1 = размер сектора в словах | |
− | + | DEC R1 | |
− | 133616$:TSTB @R4 | + | 133616$:TSTB @R4 ; Очередное слово записано ? |
− | + | BPL 133616$ | |
− | + | MOV @#177014,@R5 ; Запись первого слова данных | |
− | + | MOV R3,@R4 ; Сброс пропуска синхроимпульсов | |
− | + | INC @#177010 ; Переход к следующему адресу | |
− | + | DEC R2 ; Уменьшить счетчик записываемых слов | |
− | + | BEQ 133664$ | |
− | 133640$:TSTB @R4 | + | 133640$:TSTB @R4 ; Очередное слово записано ? |
− | + | BPL 133640$ ; Нет | |
− | + | MOV @#177014,@R5 ; Запись данных | |
− | + | INC @#177010 ; Переход к следующему адресу | |
− | + | DEC R2 ; Уменьшить счетчик записываемых слов | |
− | + | BEQ 133674$ | |
− | + | SOB R1,133640$ | |
− | + | BR 133676$ | |
− | 133664$:TSTB @R4 | + | 133664$:TSTB @R4 ; Очередное слово записано ? |
− | + | BPL 133664$ ; Нет | |
− | + | MOV #0,@R5 ; Запись нуля | |
− | 133674$:SOB R1,133664$ | + | 133674$:SOB R1,133664$ |
− | 133676$:MOV R2,23344 | + | 133676$:MOV R2,23344 ; Сохранить счетчик записываемых слов |
− | + | CALL 134256$ ; Запись контрольной суммы | |
− | 133706$:TST 23344 | + | 133706$:TST 23344 ; Счетчик записываемых слов равен нулю |
− | + | BNE 133720$ ; Нет | |
− | + | JMP 134416$ ; Да | |
− | 133720$:MOV @#177010,23342 | + | 133720$:MOV @#177010,23342 ; Сохранение регистра адреса |
− | + | INCB 23341 ; Увеличить номер текущего сектора | |
− | + | CMPB 23341,23301 ; Он превышает номер последнего сектора ? | |
− | + | BLOS 134064$ ; Нет | |
− | + | CMPB #1,23336 ; Запрошена односторонняя операция ? | |
− | + | BEQ 133766$ ; Да | |
− | + | BIT #40,R3 ; Текущая сторона - верх ? | |
− | + | BNE 133766$ ; Да | |
− | + | INC 23212 ; Увеличить номер текущей стороны | |
− | + | BR 134010$ | |
− | 133766$:INCB 23340 | + | 133766$:INCB 23340 ; Увеличить номер запрашиваемой дорожки |
− | + | MOVB 23340,23212 | |
− | + | SWAB 23212 | |
− | + | CLRB 23212 ; Текущая сторона - низ | |
− | 134010$:CLRB @#177710 ; Остановить программируемый таймер | + | 134010$:CLRB @#177710 ; Остановить программируемый таймер |
− | + | TST @#177714 ; Сбросить его готовность | |
− | + | TST @#177714 | |
− | + | MOVB #1,23341 ; Текущий номер сектора - 1 | |
− | + | CMPB #1,23336 ; Запрошена односторонняя операция | |
− | + | BEQ 134050$ ; Да | |
− | + | MOV #40,R0 | |
− | + | XOR R0,R3 ; Переменить сторону | |
− | + | 134050$:MOV R3,23204 | |
− | + | CALL 134356$ ; Восстановить РОН | |
− | + | JMP 131726$ | |
− | 134064$:TST @#177714 ; Сбросить готовность программируемого таймера | + | 134064$:TST @#177714 ; Сбросить готовность программируемого таймера |
− | + | TST @#177714 | |
− | + | MOV #36,R2 | |
− | 134100$:TST @R5 | + | 134100$:TST @R5 ; Перевод контроллера в режим чтения |
− | + | CLR R1 | |
− | + | MOVB 23302,R1 ; R1 = текущий размер межсекторного промежутка | |
− | + | ADD #6,R1 | |
− | + | CALL 134132$ ; Поиск нулевой зоны и начала след. сектора | |
− | + | BEQ 134126$ ; Она не найдена | |
− | + | JMP 133036$ | |
− | 134126$:JMP 132630$ | + | 134126$:JMP 132630$ |
; П/п поиска нулевой зоны | ; П/п поиска нулевой зоны | ||
− | 134132$:TSTB @R4 | + | 134132$:TSTB @R4 ; Очередное слово считано ? |
− | + | BPL 134132$ ; Нет | |
− | + | MOV @R5,R0 | |
− | + | BEQ 134152$ ; Это нулевая зона | |
− | + | INC R0 | |
− | + | BEQ 134152$ | |
− | + | SOB R1,134132$ | |
− | + | BR 134200$ | |
− | 134152$:BIS #400,R3 | + | 134152$:BIS #400,R3 ; Уст. бит поиска пропуска синхроимпульсов |
− | + | MOV R3,@R4 ; Начать поиск | |
− | + | BIC #400,R3 ; Сбросить бит поиска пропуска синхроимпульсов | |
− | + | MOV #226,R0 | |
− | + | MOV R3,@R4 | |
− | 134172$:TSTB @R4 | + | 134172$:TSTB @R4 ; Поиск окончен |
− | + | BMI 134204$ ; Да | |
− | + | SOB R0,134172$ | |
− | 134200$:SEZ | + | 134200$:SEZ ; Операция окончилась неуспешно |
− | + | RETURN | |
− | 134204$:TST @R5 | + | 134204$:TST @R5 |
− | + | RETURN | |
; П/п запуска таймера с вызовом п/п по его прерыванию | ; П/п запуска таймера с вызовом п/п по его прерыванию | ||
− | 134210$:CLRB @#177710 ; Остановить программируемый таймер | + | 134210$:CLRB @#177710 ; Остановить программируемый таймер |
− | + | MOV @R5,@#177712 ; Занести в буфер временную задержку | |
− | + | CMP @R5,@#177714 | |
− | + | BNE 134210$ | |
− | + | TST (R5)+ | |
− | + | MOV (R5)+,@#304 ; Занести адрес п/п в вектор прерывания | |
− | + | MOV (R5)+,@#177710 ; Запустить таймер | |
− | + | RTS R5 | |
; П/п сброса готовности программируемого таймера | ; П/п сброса готовности программируемого таймера | ||
− | 134242$:TST @#177714 ; Сбросить готовность таймера | + | 134242$:TST @#177714 ; Сбросить готовность таймера |
− | + | TSTB @#177710 ; Она сброшена ? | |
− | + | BMI 134242$ ; Нет | |
− | + | RETURN | |
; П/п записи контрольной суммы | ; П/п записи контрольной суммы | ||
− | 134256$:BIT #40000,@R4 ; Запись КС | + | 134256$:BIT #40000,@R4 ; Запись КС |
− | + | BEQ 134256$ | |
− | + | MOV #47116,@R5 | |
− | 134270$:TSTB @R4 | + | 134270$:TSTB @R4 |
− | + | BPL 134270$ | |
− | + | TST @R5 | |
− | + | RETURN | |
; П/п проверки контрольной суммы | ; П/п проверки контрольной суммы | ||
− | 134300$:MOV #36,R0 | + | 134300$:MOV #36,R0 |
− | 134304$:BIT #40000,@R4 ; Проверка КС | + | 134304$:BIT #40000,@R4 ; Проверка КС |
− | + | BNE 134314$ | |
− | + | SOB R0,134304$ | |
134314$:RETURN | 134314$:RETURN | ||
; П/п сохранения РОН | ; П/п сохранения РОН | ||
− | 134316$:MOV R0,23232 | + | 134316$:MOV R0,23232 |
− | + | MOV R1,23234 | |
− | + | MOV R2,23236 | |
− | + | MOV R3,23240 | |
− | + | MOV R4,23242 | |
− | + | MOV R5,23244 | |
− | + | MOV @#177010,23230 | |
− | + | RETURN | |
; П/п восстановления РОН | ; П/п восстановления РОН | ||
− | 134356$:MOV 23232 | + | 134356$:MOV 23232,R0 |
− | + | MOV 23234,R1 | |
− | + | MOV 23236,R2 | |
− | + | MOV 23240,R3 | |
− | + | MOV 23242,R4 | |
− | + | MOV 23244,R5 | |
− | + | MOV 23230,@#177010 | |
− | + | RETURN | |
; Завершающая процедура | ; Завершающая процедура | ||
− | 134416$:CLRB 23334 | + | 134416$:CLRB 23334 ; Код ошибки = 0 (все нормально) |
− | 134422$:CALL 125140$ | + | 134422$:CALL 125140$ ; Переслать код возврата в ЦП |
− | + | JSR R5,175400$ ; Установить адрес п/п выключения двигателя | |
− | + | .WORD 372,134454$ | |
− | + | CALL 134356$ ; Восстановить РОН | |
− | + | CLR @#177710 ; Остановить таймер | |
− | + | CALL 176422$ | |
− | + | RTI | |
; П/п останова двигателя | ; П/п останова двигателя | ||
− | 134454$:BIC #2037,23204 | + | 134454$:BIC #2037,23204 ; Сбросить биты выбора устройства,вкл. мотора |
− | + | MOV 23204,@#177130 ; Выключить двигатель | |
− | + | RETURN | |
− | 134472$:BR 134416$ | + | 134472$:BR 134416$ |
; Форматирование дорожки | ; Форматирование дорожки | ||
− | 134474$:MOV 23204 | + | 134474$:MOV 23204,R3 ; R3 = УС накопителя |
− | + | MOV #177130,R4 ; R4 = адрес РУС накопителя | |
− | + | MOV R4,R5 | |
− | + | TST (R5)+ ; R5 = адрес РД накопителя | |
− | + | SWAB 23212 | |
− | + | MOVB 23341,R2 ; R2 = формат сектора | |
− | + | BIC #177774,R2 | |
− | + | BNE 134540$ | |
− | + | MOV #13,23334 ; Ошибка = неверный формат сектора | |
− | + | JMP 134422$ | |
− | 134540$:MOVB 135422$(R2),23246 | + | 134540$:MOVB 135422$(R2),23246; (23246) = число секторов в дорожке |
− | + | MOVB 135426$(R2),23302; (23302) = размер межсекторного промежутка | |
− | + | MOV R2,R1 | |
− | + | ASL R1 | |
− | + | MOV 135412$(R1),R1 ; R1 = число слов в секторе | |
− | + | SWAB R2 | |
− | + | INC R2 ; R2 = формат сектора : номер сектора | |
− | + | MOV #1750,R0 | |
− | 134574$:TST @R4 | + | 134574$:TST @R4 ; Присутствует линия ИНДЕКС ? |
− | + | BPL 134616$ ; Нет | |
− | + | SOB R0,134574$ | |
− | 134602$:TST @R5 | + | 134602$:TST @R5 ; Установить режим готовности чтения |
− | + | MOVB #14,23334 ; Ошибка = ошибка линии ИНДЕКС | |
− | + | JMP 134422$ | |
− | 134616$:MOV #6200,R0 ; R0 = число слов в дорожке | + | 134616$:MOV #6200,R0 ; R0 = число слов в дорожке |
− | + | MOV #47116,@R5 ; Заполнение дорожки | |
− | 134626$:TST @R4 | + | 134626$:TST @R4 ; Присутствует линия ИНДЕКС ? |
− | + | BMI 134646$ | |
− | 134632$:TSTB @R4 | + | 134632$:TSTB @R4 ; Предыдущее слово записано ? |
− | + | BPL 134632$ ; Да | |
− | + | MOV #47116,@R5 ; Заполнение дорожки | |
− | + | SOB R0,134626$ | |
− | + | BR 134602$ | |
− | 134646$:MOV #20,R0 | + | 134646$:MOV #20,R0 ; R0 = размер межсект. пром. в начале дорожки |
− | 134652$:MOV #47116,@R5 ; Заполнение межсект. пром. перед заголовком | + | 134652$:MOV #47116,@R5 ; Заполнение межсект. пром. перед заголовком |
− | 134656$:TSTB @R4 | + | 134656$:TSTB @R4 ; Очередное слово записано ? |
− | + | BPL 134656$ ; Нет | |
− | + | MOV #47116,@R5 ; Заполнение межсект. пром. перед заголовком | |
− | + | SOB R0,134656$ | |
− | + | MOV #6,R0 ; R0 = размер нулевой зоны | |
− | 134674$:TSTB @R4 | + | 134674$:TSTB @R4 ; Очередное слово записано ? |
− | + | BPL 134674$ ; Нет | |
− | + | MOV #0,@R5 ; Заполнение нулевой зоны | |
− | + | SOB R0,134674$ | |
− | + | BIS #1000,R3 ; Установить бит пропуска синхроимпульсов | |
− | 134712$:TSTB @R4 | + | 134712$:TSTB @R4 |
− | + | BPL 134712$ | |
− | + | MOV #120641,@R5 ; Запись первого слова адресного маркера | |
− | + | MOV R3,@R4 ; Установить режим пропуска синхроимпульсов | |
− | + | BIC #1000,R3 ; Сбросить бит пропуска синхроимпульсов | |
− | 134730$:TSTB @R4 | + | 134730$:TSTB @R4 |
− | + | BPL 134730$ | |
− | + | MOV #177241,@R5 ; Запись второго слова адресного маркера | |
− | 134740$:TSTB @R4 | + | 134740$:TSTB @R4 |
− | + | BPL 134740$ | |
− | + | MOV 23212,@R5 ; Запись номера дорожки и стороны | |
− | + | MOV R3,@R4 ; Сбросить режим пропуска синхроимпульсов | |
− | 134752$:TSTB @R4 | + | 134752$:TSTB @R4 |
− | + | BPL 134752$ | |
− | + | MOV R2,@R5 ; Запись номера сектора и формата сектора | |
− | + | MOV #13,R0 ; R0 = размер межсект. пром. перед данными | |
− | 134764$:BIT #40000,@R4 ; Запись контрольной суммы | + | 134764$:BIT #40000,@R4 ; Запись контрольной суммы |
− | + | BEQ 134764$ | |
− | + | MOV #47116,@R5 ; Заполнение межсект. пром. перед данными | |
− | 134776$:TSTB @R4 | + | 134776$:TSTB @R4 |
− | + | BPL 134776$ | |
− | + | MOV #47116,@R5 ; Заполнение межсект. пром. перед данными | |
− | + | SOB R0,134776$ | |
− | + | MOV #6,R0 ; R0 = размер нулевой зоны | |
− | 135014$:TSTB @R4 | + | 135014$:TSTB @R4 |
− | + | BPL 135014$ | |
− | + | MOV #0,@R5 ; Заполнение нулевой зоны | |
− | + | SOB R0,135014$ | |
− | + | BIS #1000,R3 ; Установить бит пропуска синхроимпульсов | |
− | 135032$:TSTB @R4 | + | 135032$:TSTB @R4 |
− | + | BPL 135032$ | |
− | + | MOV #120641,@R5 ; Запись первого слова маркера данных | |
− | + | MOV R3,@R4 ; Установить режим пропуска синхроимпульсов | |
− | + | BIC #1000,R3 ; Сбросить бит пропуска синхроимпульсов | |
− | 135050$:TSTB @R4 | + | 135050$:TSTB @R4 |
− | + | BPL 135050$ | |
− | + | MOV #175641,@R5 ; Запись второго слова маркера данных | |
− | + | MOV R1,R0 ; R0 = размер сектора в словах | |
− | 135062$:TSTB @R4 | + | 135062$:TSTB @R4 |
− | + | BPL 135062$ | |
− | + | MOV 23342,@R5 ; Запись первого слова зоны данных | |
− | + | MOV R3,@R4 ; Сбросить режим пропуска синхроимпульсов | |
− | + | DEC R0 | |
− | 135076$:TSTB @R4 | + | 135076$:TSTB @R4 |
− | + | BPL 135076$ | |
− | + | MOV 23342,@R5 ; Заполнение зоны данных | |
− | + | SOB R0,135076$ | |
− | + | INC R2 ; Увеличить номер сектора | |
− | + | MOVB 23302,R0 ; R0 = размер межсект. пром. перед заголовком | |
− | 135116$:BIT #40000,@R4 ; Запись контрольной суммы | + | 135116$:BIT #40000,@R4 ; Запись контрольной суммы |
− | + | BEQ 135116$ | |
− | + | DECB 23246 ; Уменьшить счетчик секторов | |
− | + | BNE 134652$ | |
− | + | MOV #1750,R0 | |
− | 135136$:TST @R4 | + | 135136$:TST @R4 ; Присутствует линия ИНДЕКС ? |
− | + | BMI 135170$ ; Да | |
− | 135142$:TSTB @R4 | + | 135142$:TSTB @R4 |
− | + | BPL 135142$ | |
− | + | MOV #47116,@R5 ; Заполнение конца дорожки | |
− | + | SOB R0,135136$ | |
− | + | TST @R5 ; Установить режим готовности чтения | |
− | + | MOVB #14,23334 ; Ошибка - ошибка линии ИНДЕКС | |
− | + | JMP 134422$ | |
− | 135170$:MOV #5,R0 | + | 135170$:MOV #5,R0 |
− | 135174$:TSTB @R4 | + | 135174$:TSTB @R4 |
− | + | BPL 135174$ | |
− | + | MOV #47116,@R5 ; Заполнение в начале первых пяти слов | |
− | + | SOB R0,135174$ | |
− | + | TST @R5 ; Установить режим готовности чтения | |
− | + | JMP 134416$ | |
; П/п-мы установок параметров | ; П/п-мы установок параметров | ||
− | 135214$:CLR R0 | + | 135214$:CLR R0 |
− | + | MOVB 23335,R0 ; R0 = номер устанавливаемого параметра (1 - 4) | |
− | + | CMP #4,R0 ; Он в диапазоне (1 - 4) ? | |
− | + | BHIS 135242$ ; Да | |
− | + | MOVB #11,23334 ; Ошибка - неверный массив параметров | |
− | + | JMP 134422$ | |
− | 135242$:MOVB 23340 | + | 135242$:MOVB 23340,23246 ; (23246) = значение устанавливаемого параметра |
− | + | DEC R0 | |
− | + | MOV #135272$,R1 | |
− | + | ADD R0,R1 | |
− | + | ADD R0,R1 | |
− | + | MOV @R1,R1 | |
− | + | CALL @R1 ; Вызов соответствующей п/п | |
− | + | JMP 134416$ | |
; Адреса начала п/п установки значений параметров | ; Адреса начала п/п установки значений параметров | ||
− | 135272$:.WORD 135350$,135356$,135364$,135372$ | + | 135272$:.WORD 135350$,135356$,135364$,135372$ |
− | 135302$:MOVB 23337 | + | 135302$:MOVB 23337,R0 ; R0 = номер накопителя |
− | + | CMPB #377,R0 ; Устанавливается для всех накопителей ? | |
− | + | BEQ 135326$ ; Да | |
− | + | MOV #1,R2 ; R2 = число накопителей, для кот. уст. парам. | |
− | + | BICB #374,R0 | |
− | + | BR 135334$ | |
− | 135326$:CLR R0 | + | 135326$:CLR R0 |
− | + | MOV #4,R2 ; R2 = число накопителей, для кот. уст. парам. | |
− | 135334$:ADD R0,R1 | + | 135334$:ADD R0,R1 ; Корректировка под номер накопителя |
− | 135336$:MOVB 23246 | + | 135336$:MOVB 23246,@R1 ; Установка нового значения |
− | + | INC R1 | |
− | + | SOB R2,135336$ | |
− | + | RETURN | |
− | 135350$:MOV #23260,R1 ; R1 = адрес буфера времен шага | + | 135350$:MOV #23260,R1 ; R1 = адрес буфера времен шага |
− | + | BR 135302$ | |
− | 135356$:MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки | + | 135356$:MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки |
− | + | BR 135302$ | |
− | 135364$:MOV #23270,R1 ; R1 = адрес буфера числа секторов в дорожке | + | 135364$:MOV #23270,R1 ; R1 = адрес буфера числа секторов в дорожке |
− | + | BR 135302$ | |
− | 135372$:MOV #23274,R1 ; R1 = адрес буфера параметра SKIP | + | 135372$:MOV #23274,R1 ; R1 = адрес буфера параметра SKIP |
− | + | MOV #2,23246 ; Принудительная установка пропуска дорожки | |
− | + | BR 135302$ | |
; Устанавливаемые биты в РУС накопителя при выборе соотв. устройства | ; Устанавливаемые биты в РУС накопителя при выборе соотв. устройства | ||
− | 135406$:BYTE 3,2,1,0 | + | 135406$:.BYTE 3,2,1,0 |
; Число слов в секторе (формат x,256,512,1024 байт) | ; Число слов в секторе (формат x,256,512,1024 байт) | ||
− | 135412$:.WORD 0,200,400,1000 | + | 135412$:.WORD 0,200,400,1000 |
; Число секторов в дорожке (формат x,256,512,1024 байт) | ; Число секторов в дорожке (формат x,256,512,1024 байт) | ||
− | 135422$:.BYTE 0,20,12,5 | + | 135422$:.BYTE 0,20,12,5 |
; Размер межсекторного промежутка перед заголовком (формат x,256,512,1024 байт) | ; Размер межсекторного промежутка перед заголовком (формат x,256,512,1024 байт) | ||
− | 135426$:.BYTE 0,33,22,72 | + | 135426$:.BYTE 0,33,22,72 |
− | 135432$:.BYTE 0,240,124,242 | + | 135432$:.BYTE 0,240,124,242 |
− | |||
</pre> | </pre> |
Latest revision as of 07:41, 13 January 2008
; ****************************************************** ; * * ; * ДРАЙВЕР КАНАЛА 2 * ; * * ; * Адреса 125030 - 135435 * ; * * ; ****************************************************** ; *** ОСНОВНАЯ ПОДПРОГРАММА ОБСЛУЖИВАНИЯ КАНАЛА 2 *** 125030$:MOV @#23200,R0 ; R0 = адрес массива параметров (МП) в ОЗУ ЦП CLC ; Преобр. для загрузки в рег. адреса планов ROR R0 MOV R0,@#23200 INC R0 ; R0 = адрес типа устройства MOV R0,@#177010 MOVB @#177014,R0 ; R0 = тип устройства MOV R0,R5 ASH #-3,R0 CMP R0,#3 ; Тип устройства в пределах 0 - 37 ? BHI 125116$ ; Нет ASL R0 BNE 125104$ ; Обслуживается не дисковод TST @#7044 ; Разрешено обращение к дисководу ? BMI 125116$ ; Нет 125104$:CALL @125124$(R0) ; Вызов соответствующей п/п обслуживания уст-ва 125110$:DEC @#7062 ; Уменьшить значение флага вызова RETURN 125116$:CALL 125162$ ; Вызов п/п обслуживания кассеты ПЗУ BR 125110$ ; Адреса п/п обслуживания устройств (дисковод, магнитофон, кассета ПЗУ, ОЗУ ПП) 125124$:.WORD 131176$,126236$,125162$,125644$ ; П/п окончания обслуживания устройства 125134$:CLRB @#23334 ; Сбросить код возврата (все нормально) 125140$:MOV @#23200,@#177010 MOV @#23334,@#177014; Записать код возврата в ОЗУ ЦП 125154$:TST @#177064 ; Восст. готовность канала 2 со стороны ЦП RETURN ; П/п обслуживания кассеты ПЗУ 125162$:JSR R5,125560$ ; Чтение МП .WORD 5 CMPB #10,23335 ; Код функции = 10 (чтение) ? BEQ 125210$ 125200$:MOVB #2,23334 ; Код возврата = 2 (ошибочный МП) BR 125520$ 125210$:MOV 23340,R1 ; R1 = адрес кассеты ПЗУ CMP #60000,R1 ; Он превышает 60000 ? BLOS 125200$ ; Да BIC #1,R1 MOV 23342,R2 ; R2 = адрес буфера в ОЗУ ЦП CMP #160000,R2 ; Он превышает 160000 ? BLOS 125200$ ; Да ASR R2 BIC #100000,R2 MOV 23344,R3 ; R3 = число считываемых слов BEQ 125514$ ; Оно равно нулю MOVB 23337,R0 ; R0 = номер кассеты ПЗУ MTPS #200 ; Запретить прерывания MOV @#4,R5 ; Сохранить значение 4 вектора в R5 MOV #125544$,@#4 ; Загрузить новое значение вектора BIC #1,@#177054 ; Откл. сист. ПЗУ в диапазоне 100000-117777 ASR R0 ; Кассета N1 ? BCS 125320$ ; Нет BIC #10,@#177054 ; Выбор кассеты N1 BR 125326$ 125320$:BIS #10,@#177054 ; Выбор кассеты N2 125326$:BIC #6,@#177054 ; Ни одного банка не выбрано CMP R1,#17776 ; Адрес кассеты меньше 20000 ? BHI 125354$ ; Нет MOV #2,R4 BIS R4,@#177054 ; Выбор банка N1 BR 125406$ 125354$:CMP R1,#37776 ; Адрес кассеты меньше 40000 ? BHI 125376$ ; Нет BIS #4,@#177054 ; Выбор банка N2 MOV #1,R4 BR 125406$ 125376$:BIS #6,@#177054 ; Выбор банка N3 CLR R4 125406$:BIC #60000,R1 BIS #100000,R1 MOV #120000,R0 SUB R1,R0 ; Вычисление граничных значений ASR R0 125426$:CMP R3,R0 ; Область перекачки содержится в одном банке ? BHI 125440$ ; Нет MOV R3,R0 CLR R3 BR 125442$ 125440$:SUB R0,R3 ; Вычесть из числа запрошенных слов 125442$:MOV R2,@#177010 ; Цикл перекачки MOV (R1)+,@#177014 INC R2 CMP #70000,R2 ; Произошел выход за диапазон ОЗУ ЦП (160000) ? BLOS 125200$ ; Да SOB R0,125442$ TST R3 ; Перекачка закончена ? BEQ 125514$ ; Да DEC R4 ; Переход к следующему банку BMI 125200$ ; Переход за границу кассеты ПЗУ ADD #2,@#177054 ; Установить следующий банк MOV #100000,R1 MOV #10000,R0 BR 125426$ 125514$:CLRB 23334 ; Очистить код возврата (все нормально) 125520$:BIS #1,@#177054 ; Подключить системное ПЗУ MOV R5,@#4 ; Восстановить 4 вектор MTPS #0 ; Разрешить прерывания CALL 125140$ ; Завершить обслуживание RETURN ; П/п обработки прерывания 4 при чтении с кассеты ПЗУ 125544$:MOVB #1,23334 ; Код возврата = 1 (отсутствует банк ПЗУ) TST (SP)+ ; Вычеркнуть из стека значения PC и PS TST (SP)+ BR 125520$ ; П/п чтения МП из ОЗУ ЦП 125560$:MOV (R5)+,R0 ; R0 = число слов для чтения MOV #23334,R1 ; R1 = адрес МП в ОЗУ ПП MOV @#23200,@#177010 BR 125602$ 125576$:INC @#177010 ; Цикл чтения 125602$:MOV @#177014,(R1)+ SOB R0,125576$ RTS R5 ; П/п записи МП в ОЗУ ЦП 125612$:MOV (R5)+,R0 ; R0 = число слов для записи MOV #23334,R1 ; R1 = адрес МП в ОЗУ ПП MOV @#23200,@#177010 BR 125634$ 125630$:INC @#177010 ; Цикл записи 125634$:MOV (R1)+,@#177014 SOB R0,125630$ RTS R5 ; П/п обслуживания функций работы с памятью ПП 125644$:JSR R5,125560$ ; Чтение МП .WORD 5 CLRB @#23334 ; Код возврата = 0 CMP R5,#32 ; Тип устройства = 32 ? BNE 125720$ ; Нет MOVB @#23335,R0 ; R0 = код функции MOV R0,R5 ASH #-3,R0 CMP R0,#3 ; Код функции в пределах 0 - 37 ? BHI 125720$ ; Нет ASL R0 ADD R0,PC ; Переход по соответствующему адресу BR 125730$ ; Запрос и освобождение блоков памяти BR 126024$ ; Чтение памяти ПП BR 126050$ ; Запись в память ПП BR 126074$ ; Запуск п/п пользователя 125720$:JMP 125162$ 125724$:JMP 125154$ ; Запрос и освобождение блоков памяти 125730$:MOV @#23340,R1 ; R1 = начальный адрес в памяти ПП MOV @#23342,R0 ; R0 = размер блока в словах ASL R0 ASR R5 ; Функция запроса блока памяти ? BCC 126012$ ; Нет CALL 176132$ ; Запросить область памяти ASR R0 CMP R0,@#23342 ; Полученное значение >= запрошенного ? BHIS 125770$ ; Да MOVB #377,@#23334 ; Код возврата = 377 (мало памяти) 125770$:MOV R0,@#23342 ; Возвратить объем полученной памяти MOV R1,@#23340 ; Возвратить адрес блока JSR R5,125612$ ; Записать МП в ОЗУ ЦП .WORD 4 JMP 125154$ 126012$:CALL 176300$ ; Освободить блок памяти BMI 125720$ JMP 125140$ ; Чтение памяти ПП 126024$:CALL 126110$ ; Получение адресов ЦП, ПП и числа слов BEQ 125720$ ; Число слов равно нулю BR 126040$ 126034$:INC @#177010 ; Цикл чтения 126040$:MOV (R1)+,@#177014 SOB R0,126034$ BR 125724$ ; Запись в память ПП 126050$:CALL 126110$ ; Получение адресов ЦП, ПП и числа слов BEQ 125720$ ; Число слов равно нулю BR 126064$ 126060$:INC @#177010 ; Цикл записи 126064$:MOV @#177014,(R1)+ SOB R0,126060$ BR 125724$ ; Запуск п/п пользователя 126074$:MOV @#23340,@#7140 ; Сохранение адреса запуска INC @#7076 ; Установить флаг запуска п/п пользователя BR 125724$ ; П/п получения адресов блоков памяти ЦП, ПП и числа слов для обмена 126110$:MOV @#23340,R1 ; R1 = адрес памяти ПП MOV @#23342,R0 ; R0 = адрес памяти ЦП CLC ROR R0 MOV R0,@#177010 ; Загрузка адреса в регистр адреса планов MOV @#23344,R0 ; R0 = число слов для обмена RETURN ; *** МАГНИТОФОН *** ; П/п установки начальных значений 126136$:CLR R0 MOV #23304,R1 MOV #14,R2 126150$:MOV R0,(R1)+ ; Очистка области ОЗУ п/п работы с магнитофоном SOB R2,126150$ MOV #320,23304 ; Длина бита "0" MOV #150,23306 ; Длина бита "1" MOV #17500,23310 ; Число битов "1" при записи пилот-тона загол. MOV #3720,23312 ; Число битов "1" при записи пилот-тона данных MOV #17540,23314 ; Число битов "1" при чтении пилот-тона загол. MOV #1750,23316 ; Число битов "1" при чтении пилот-тона данных MOV #1750,23320 MOV #64,23322 ; Разброс времени между перепадами лог. уровня RETURN ; Основная п/п обслуживания магнитофона 126236$:JSR R5,125560$ ; Чтение массива параметров .WORD 27 CLR R5 126246$:SOB R5,126246$ ; Задержка MTPS #200 ; Запретить прерывания CALL 176376$ ; Останов программируемого таймера CALL 130672$ ; Ожидание готовности программируемого таймера MOV #127734$,@#304 ; Настройка вектора прерывания прогр. таймера MOV #200,@#306 MOV #130570$,@#310 ; Настройка вектора прерывания по внеш. событию MOV #200,@#312 CLR @#177700 ; Запрет прерываний от клавиатуры BIS #400,@#177054 ; Запрет прерываний от сет. таймера в канале ПП BIC #200,@#177716 ; Выключить генератор звукового сигнала BIC #107,@#177066 ; Запретить прерывания от каналов связи с ЦП MOVB 23335,R0 ; R0 = код функции BIC #177600,R0 ASL R0 CALL @126502$(R0) ; Вызов соответствующей п/п MOVB R0,23334 ; Код возврата BIC #14,@#177716 ; Запрет приема информации по линии вн. событие CALL 130672$ MOV 23200,R4 ; R4 = адрес МП в ОЗУ ЦП ADD #14,R4 MOV R4,@#177010 MOV #23364,R4 ; R4 = адрес МП в ОЗУ ПП (имя прочит. файла) MOV #13,R2 126422$:MOV (R4)+,@#177014 ; Пересылка INC @#177010 SOB R2,126422$ BIC #400,@#177054 ; Разрешить прерывания от таймера в канале ПП MOV #100,@#177700 ; Разрешить прерывания от клавиатуры BIS #200,@#177716 ; Включить генератор звукового сигнала BIS #107,@#177066 ; Разрешить прерывания от каналов связи с ЦП CALL 125140$ ; Переслать код возврата в ОЗУ ЦП CALL 176422$ ; Запрет прерываний от прогр. таймера MTPS #0 ; Разрешить прерывания RETURN ; Адреса п/п обслуживания работы с магнитофоном 126502$:.WORD 126546$,126554$,126632$,126546$ .WORD 126546$,126546$,126546$,126546$ .WORD 127102$,127110$,126546$,126546$ .WORD 127116$,127132$,127044$,126546$ .WORD 126714$,126662$ 126546$:MOV #10,R0 ; R0 = код возврата (неверный код функции) RETURN ; П/п установки параметров одинарной плотности записи 126554$:MOV #320,23304 ; Длина бита "0" MOV #150,23306 ; Длина бита "1" MOV #17500,23310 ; Число битов "1" перед заголовком MOV #3720,23312 ; Число битов "1" перед зоной данных MOV #17540,23314 ; Число перепадов уровня при чтении (загол.) MOV #1750,23316 ; Число перепадов уровня при чтении (данные) MOV #1750,23320 CLR R0 RETURN ; П/п установки параметров двойной плотности записи 126632$:MOV #150,23304 ; Длина бита "0" MOV #64,23306 ; Длина бита "1" NOP MOV #3720,23320 CLR R0 RETURN ; П/п записи блока данных на магнитную ленту 126662$:MOV SP,23332 ; Сохранить значение указателя стека MOV 23360,R4 ; R4 = адрес буфера в ОЗУ ЦП CLC ROR R4 MOV R4,@#177010 CALL 127476$ ; Подготовка и пуск программируемого таймера MOV #200,R2 ; R2 = число записываемых слов BR 126776$ ; П/п записи файла с заголовком 126714$:MOV SP,23332 ; Сохранить значение указателя стека MOV 23360,R4 ; R4 = адрес буфера в ОЗУ ЦП CLC ROR R4 MOV R4,@#177010 CALL 127476$ ; Подготовка и пуск программируемого таймера CALL 127536$ ; Запись пилот-тона перед заголовком CALL 127560$ ; Запись имени файла MOV 23362,R0 ; R0 = число записываемых слов MOV R0,R2 ; R2 = число записываемых слов TST R2 ; Оно равно нулю ? BEQ 127040$ CALL 127602$ ; Запись числа слов в файл MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП CALL 127602$ ; Запись адреса буфера в файл 126776$:CALL 127544$ ; Запись пилот-тона перед зоной данных CLR R4 ; Контрольная сумма = 0 127004$:MOV @#177014,R0 ; R0 = слово данных INC @#177010 ; Переход к следующему адресу ADD R0,R4 ; Подсчет контрольной суммы файла ADC R4 CALL 127602$ ; Запись слова данных SOB R2,127004$ ; Цикл по R2 (число записываемых слов) MOV R4,R0 ; R0 = контрольная сумма CALL 127602$ ; Запись контрольной суммы CALL 127664$ ; Запись бита "1" 127040$:CLR R0 RETURN ; П/п чтения блока данных 127044$:MOV SP,23332 ; Сохранить значение указателя стека MOV #200,R2 ; R2 = число считываемых слов MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП CLC ROR R0 MOV R0,@#177010 CALL 130020$ ; Подготовка и пуск программируемого таймера CALL 130156$ ; Поиск пилот-тона перед зоной данных BR 127372$ ; Точка входа при чтении файла с заголовком 127102$:CLR 23330 ; Признак реального чтения файла BR 127124$ ; Точка входа при чтении файла с пропуском заголовка 127110$:CLR 23330 ; Признак реального чтения файла BR 127140$ ; Точка входа при фиктивном чтении файла с заголовком 127116$:MOV #4,23330 ; Признак фиктивного чтения 127124$:CLR 23326 ; Признак проверки заголовка BR 127146$ ; Точка входа при фиктивном чтении файла с пропуском заголовка 127132$:MOV #4,23330 ; Признак фиктивного чтения 127140$:MOV #22,23326 ; Признак пропуска заголовка 127146$:MOV SP,23332 ; Сохранить значение указателя стека CALL 130020$ ; Подготовка и пуск программируемого таймера CALL 130060$ ; Поиск пилот-тона перед заголовком CALL 130254$ ; Автоподстройка по пилот-тону CALL 130372$ ; Чтение заголовка BIT #1,R1 ; Тип устройства ? BEQ 127220$ ; MSX CALL 130436$ ; Чтение длины файла в словах MOV R0,23406 ; Сохранить ее в МП CALL 130436$ ; Чтение адреса загрузки файла MOV R0,23404 ; Сохранить его в МП 127220$:MOV 23320,R3 ADD 23326,PC ; Пропустить проверку заголовка (на 127252$)? MOV #10,R2 ; R2 = длина заголовка в словах MOV #23364,R4 ; R4 = адрес прочитанного заголовка MOV #23340,R0 ; R0 = адрес заданного заголовка 127244$:CMP (R0)+,(R4)+ ; Цикл сравнения BNE 127462$ ; Не равны SOB R2,127244$ 127252$:BIT #1,R1 ; Тип устройства ? BNE 127312 ; УКНЦ MOV #200,R2 ; R2 = число записываемых слов MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП CLC ROR R0 MOV R0,@#177010 MOV #10,R3 CALL 130156$ ; Поиск пилот-тона перед зоной данных BR 127372$ 127312$:MOV 23362,R0 ; R0 = число считываемых слов TST R0 ; Оно превышает 32767 ? BMI 127330$ ; Да CMP 23406,R0 ; Число запрошенных слов превышает длину файла? BHI 127334$ ; Нет 127330$:MOV 23406,R0 ; Используем длину файла 127334$:MOV R0,R2 ; R2 = число считываемых слов MOV 23404,23410 MOV 23360,R0 ; R0 = адрес буфера в ОЗУ ЦП CLC ROR R0 BCC 127366$ ; Четный адрес MOV 23404,R0 ; Используется считанный адрес CLC ROR R0 127366$:MOV R0,@#177010 127372$:TST R2 ; Число считываемых слов равно нулю ? BEQ 127452$ ; Да CLR R4 ; Контрольная сумма = 0 CALL 130336$ ; Поиск и чтение первого слова данных BR 127412$ 127406$:CALL 130436$ ; Чтение слова 127412$:ADD 23330,PC ; Фиктивное чтение (на 127422$) ? MOV R0,@#177014 ; Пересылка в ОЗУ ЦП 127422$:INC @#177010 ; Переход к следующему адресу ADD R0,R4 ; Подсчет контрольной суммы ADC R4 SOB R2,127406$ BIT #1,R1 ; Тип устройства BEQ 127452$ ; MSX CALL 130436$ ; Чтение контрольной суммы CMP R0,R4 ; Считанная КС равна подсчитанной ? BNE 127470$ 127452$:CLR R0 127454$:MTPS #200 RETURN 127462$:MOV #1,R0 ; R0 = не совпадает заголовок BR 127454$ 127470$:MOV #12,R0 ; R0 = не совпадает контрольная сумма BR 127454$ ; П/п начальной подготовки перед записью 127476$:BIC #14,@#177716 ; Блокировка приема информации с МЛ CLR @#177712 ; Очистить счетчик прогр. таймера 127510$:TST @#177714 ; Счетчик очищен ? BNE 127510$ ; Нет MOV #101,@#177710 ; Пуск таймера и разрешение прерываний MOV #4,R3 ; R3 = число записываемых импульсов MTPS #0 ; Разрешить прерывания RETURN ; Точка входа при записи пилот-тона перед заголовком 127536$:MOV 23310,R4 ; R4 = число битов "1" в пилот-тоне BR 127550$ 127544$:MOV 23312,R4 ; R4 = число "1" в пилот-тоне перед данными 127550$:CALL 127664$ ; Запись бита "1" SOB R4,127550$ ; Цикл по R4 RETURN ; П/п записи имени файла 127560$:MOV #10,R2 ; R2 = размер имени файла в словах MOV #23340,R4 ; R4 = адрес начала имени файла 127570$:MOV (R4)+,R0 ; R0 = очередное слово из имени файла CALL 127602$ ; Запись слова SOB R2,127570$ ; Цикл по R2 RETURN ; П/п записи слова на МЛ 127602$:CALL 127616$ ; Запись младшего байта SWAB R0 CALL 127616$ ; Запись старшего байта RETURN ; П/п записи байта на МЛ ; /-----------------------------------------------------------------\ ; ! СТРУКТУРА БАЙТА ПРИ ЗАПИСИ НА МЛ ! ; ! ! ; ! бит "0", информационные биты (0) -- (7), бит "1", бит "1" ! ; \-----------------------------------------------------------------/ 127616$:CALL 127660$ ; Запись бита "0" SEC ; Признак окончания байта 127624$:RORB R0 ; Выдвинуть очередной бит BEQ 127646$ ; Байт окончился BCC 127640$ ; Выдвинут бит "0" CALL 127664$ ; Запись бита "1" BR 127624$ 127640$:CALL 127660$ ; Запись бита "0" BR 127624$ 127646$:CALL 127664$ ; Запись концевика (два бита "1") CALL 127664$ RETURN ; Точка входа при записи бита "0" 127660$:CLR R5 ; Признак записи бита "0" BR 127670$ ; Точка входа при записи бита "1" 127664$:MOV #14,R5 ; Признак записи бита "1" 127670$:CALL 130636$ ; Проверка нажатия "СТОП" TST R3 ; Запись бита окончена ? BNE 127670$ ; Нет ADD R5,PC ; Если запись "1", на 127716$ MOV 23304,@#177712 ; Занести длительность "0" в буфер таймера MOV #2,R3 ; R3 = число записываемых импульсов BR 127730$ 127716$:MOV 23306,@#177712 ; Занести длительность "1" в буфер таймера MOV #4,R3 ; R3 = число записываемых импульсов 127730$:CLC RETURN ; П/п обработки прерывания от программируемого таймера 127734$:BIS #2,@#177716 ; Установить высокий уровень при записи на МЛ MOV #127752$,@#304 ; Новое значения вектора прерывания BR 127766$ 127752$:BIC #2,@#177716 ; Установить низкий уровень при записи на МЛ MOV #127734$,@#304 ; Новое значение вектора прерывания 127766$:TST @#177714 ; Сбросить готовность таймера TSTB @#177710 ; Готовность сброшена ? BMI 127766$ ; Нет DEC R3 ; Уменьшить счетчик записываемых импульсов BMI 130006$ ; Он отрицательный RTI 130006$:MOV #14,R0 ; R0 = ошибка выдержки времени при записи MOV 23332,SP RETURN ; П/п начальной подготовки перед чтением 130020$:CLR @#177710 ; Остановить программируемый таймер MOV 23336,R1 ; R1 = тип устройства (УКНЦ или MSX) CLR @#177712 ; Очистить буфер таймера 130034$:TST @#177714 ; Буфер очищен ? BNE 130034$ ; Нет BIS #14,@#177716 ; Разрешить прием информации с МЛ MOV #21,@#177710 ; Пуск таймера и разрешение прерывания при ; изменении информации на линии МЛ RETURN ; П/п поиска пилот-тона перед заголовком 130060$:MTPS #200 ; Запретить прерывания 130064$:MOV 23314,R2 ; R2 = число перепадов уровня при поиске загол. 130070$:MOV R5,R4 ; R4 = длина предыдущего интервала 130072$:CALL 130636$ ; Проверка нажатия "СТОП" BIT #40,@#177710 ; Перепад произошел ? BEQ 130072$ ; Нет MOV @#177714,R5 ; R5 = длина текущего интервала 130112$:TST @#177714 ; Сбросить готовность таймера BIT #250,@#177710 ; Готовность сброшена ? BNE 130112$ ; Нет SUB R5,R4 ; Вычислить разность между длинами интервалов BPL 130134$ NEG R4 130134$:CMP R4,23322 ; Разброс длин в норме ? BHI 130064$ ; Нет SOB R2,130070$ ; Цикл по R2 MOV #10,R3 MTPS #0 RETURN ; П/п поиска пилот-тона перед зоной данных 130156$:MTPS #200 ; Запретить прерывания 130162$:MOV 23316,R0 ; R0 = число перепадов уровня при поиске загол. 130166$:MOV R5,R4 ; R4 = длина предыдущего интервала 130170$:CALL 130636$ ; Проверка нажатия "СТОП" BIT #40,@#177710 ; Перепад произошел ? BEQ 130170$ ; Нет MOV @#177714,R5 ; R5 = длина текущего интервала 130210$:TST @#177714 ; Сбросить готовность таймера BIT #250,@#177710 ; Готовность сброшена ? BNE 130210$ ; Нет SUB R5,R4 ; Вычислить разность между длинами интервалов BPL 130232$ NEG R4 130232$:CMP R4,23322 ; Разброс длин в норме ? BHI 130162$ ; Нет SOB R0,130166$ ; Цикл по R0 MOV #10,R3 MTPS #0 RETURN ; П/п вычисления усредненного значения длины бита (между "0" и "1") 130254$:MOV R1,R4 ; Сохранить значение R1 в R4 MOV #10,R0 ; R0 = число читаемых импульсов CLR R1 CLR R3 130266$:CALL 130530$ ; Чтение бита BIS #170000,R5 ; Преобразование в отрицательное число SUB R5,R1 ; Прибавить к общей длине SOB R0,130266$ ; Цикл по R0 MOV #10,R3 DIV #10,R0 ; Вычисление среднего значения длины "1" MOV R0,R1 ; R1 = длина "1" ASR R0 ; R0 = длина "1" / 2 ADD R1,R0 ; R0 = среднее между длиной "1" и "0" NEG R0 ; Преобразование в отрицательное число (12 бит) BIC #170000,R0 MOV R0,23324 ; Сохранение его в памяти MOV R4,R1 ; Восстановление R1 RETURN ; П/п поиска данных (определяются по биту "0") 130336$:CLR R5 ; Очередной бит не прочитан 130340$:CALL 130636$ ; Проверка нажатия "СТОП" TST R5 ; Бит прочитан ? BEQ 130340$ ; Нет INC R3 ; Увеличить счетчик импульсов CMP R5,23324 ; Это бит "0" ? BHIS 130336$ ; Нет INC R3 INC R3 CALL 130422$ ; Дочитать слово RETURN ; П/п чтения имени файла 130372$:MOV #10,R2 ; R2 = длина имени файла в словах MOV #23364,R4 ; R4 = адрес буфера CALL 130336$ ; Поиск и чтение первого слова BR 130414$ 130410$:CALL 130436$ ; Чтение очередного слова 130414$:MOV R0,(R4)+ ; Поместить в буфер SOB R2,130410$ ; Цикл по R2 RETURN ; П/п дочитывания слова 130422$:CLRB R0 BIS #200,R0 ; Признак окончания чтения байта CALL 130470$ ; Дочитать байт BR 130442$ ; П/п чтения слова 130436$:CALL 130454$ ; Прочесть младший байт 130442$:SWAB R0 CALL 130454$ ; Прочесть старший байт SWAB R0 RETURN ; П/п чтения байта 130454$:CLRB R0 BIS #200,R0 ; Установить признак окончания CALL 130530$ ; Прочесть бит BCS 130516$ ; Это не "0" (ошибка) 130470$:CALL 130530$ ; Прочесть бит RORB R0 ; "Задвинуть" бит BCC 130470$ ; Пока не конец CALL 130530$ ; Прочесть бит BCC 130516$ ; Это не "1" (ошибка) CALL 130530$ ; Прочесть бит BCC 130516$ ; Это не "1" (ошибка) RETURN 130516$:MOV #11,R0 ; R0 = ошибка чтения MOV 23332,SP RETURN ; П/п чтения бита 130530$:CLR R5 ; Бит еще не прочитан 130532$:CALL 130636$ ; Проверка нажатия "СТОП" TST R5 ; Бит прочитан ? BEQ 130532$ ; Нет CMP R5,23324 ; Это "0" ? BLO 130560$ ; Да MOV #3,R3 SEC ; Признак бита "1" BR 130566$ 130560$:MOV #1,R3 CLC ; Признак бита "0" 130566$:RETURN ; П/п обработки прерывания по линии МЛ при изменении уровня сигнала 130570$:TST R3 ; Счетчик равен нулю ? BNE 130604$ ; Нет TST R5 ; Обработка предыдущего бита окончена ? BNE 130624$ ; Нет MOV @#177714,R5 ; R5 = длина импульса 130604$:TST @#177714 ; Сбросить готовность таймера BIT #250,@#177710 ; Готовность сброшена ? BNE 130604$ ; Нет DEC R3 ; Уменьшить счетчик импульсов RTI 130624$:MOV #13,R0 ; R0 = ошибка выдержки времени при чтении MOV 23332,SP RETURN ; П/п проверки нажатия клавиши "СТОП" 130636$:TSTB @#177700 ; Клавиша нажата ? BPL 130670$ ; Нет CMP #4,@#177702 ; Это "СТОП" ? BNE 130670$ ; Нет MOV 23332,SP MOV #377,R0 ; R0 = нажата клавиша "СТОП" MTPS #200 ; Запретить прерывания 130670$:RETURN ; П/п выключения программируемого таймера 130672$:CLR @#177710 ; Выключить таймер (режим "ОСТАНОВ") TST @#177714 ; Сбросить готовность таймера TST @#177710 ; Готовность сброшена ? BNE 130672$ ; Нет RETURN ; *** ДИСКОВОД *** ; П/п установки начальных значений 130712$:TST @#177132 ; Проверка присутствия контроллера дисковода CLR 23204 ; Очистить управляющее слово MOV 23204,@#177130 ; Инициализация контроллера CLRB 23334 CLR 23220 CLR 23222 BIT #10000,@#177704 ; Подключен 80-дорожечный дисковод ? BEQ 131030$ ; Нет ; Параметры для 80-дорожечного дисковода MOV #620,23216 ; Время разгона двигателя MOV #23260,R1 ; R1 = адрес буфера времен шага MOV #3,R0 ; R0 = время шага CALL 131164$ ; Установить для всех четырех накопителей MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки MOV #44,R0 ; R0 = время загрузки головки CALL 131164$ ; Установить для всех четырех накопителей MOVB #50,23226 ; Номер дорожки, где вкл. прекоррекция 250 нс MOVB #120,23227 ; Номер дорожки, где вкл. прекоррекция 500 нс BR 131102$ ; Параметры для 40-дорожечного дисковода 131030$:MOV #1750,23216 ; Время разгона двигателя MOV #23260,R1 ; R1 = адрес буфера времен шага MOV #24,R0 ; R0 = время шага CALL 131164$ ; Установить для всех четырех накопителей MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки MOV #50,R0 ; R0 = время загрузки головки CALL 131164$ ; Установить для всех четырех накопителей MOVB #10,23226 ; Номер дорожки, где вкл. прекоррекция 250 нс MOVB #36,23227 ; Номер дорожки, где вкл. прекоррекция 500 нс 131102$:MOV #23270,R1 ; R1 = адрес буфера числа секторов в дорожке MOV #12,R0 ; R0 = число секторов в дорожке CALL 131164$ ; Установить для всех четырех накопителей MOV #23274,R1 ; R1 = адрес буфера параметров SKIP (REGIM) MOV #1,R0 ; R0 = параметр SKIP CALL 131164$ ; Установить для всех четырех накопителей MOV #2,23250 ; Текущий формат сектора - 512 байт MOV #-1,23337 MOV #-1,23254 ; Неопределенный номер текущих дорожек MOV #-1,23256 RETURN 131164$:MOV #4,R2 ; R2 = максимальное число накопителей 131170$:MOVB R0,(R1)+ ; Установить параметр SOB R2,131170$ RETURN ; Основная п/п управления накопителем 131176$:JSR R5,125560$ ; Чтение МП .WORD 5 CALL 176376$ ; Останов программируемого таймера JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п .WORD 10,131224$,107 ; по адресу 131224$ RETURN 131224$:CALL 134242$ ; Сброс готовности программируемого таймера CLRB @#177710 ; Перевести таймер в режим "ОСТАНОВ" CALL 134316$ ; Сохранить значения РОН BIC #175754,23204 ; Сброс в УС прекоррекции,номера стороны ... BICB #300,23335 ; Очистка старших битов кода функции BEQ 131516$ ; Код функции = 0 (ошибка) CMPB #10,23335 ; Код функции >= 10(8) ? BLOS 131272$ ; Да JMP 135214$ ; Код функции в пределе 1 -- 7 131272$:TSTB 23337 ; Какая сторона запрошена ? BPL 131316$ ; Низ BIS #40,23204 ; Установить "ВЕРХ" в УС MOVB #1,23212 ; Текущая сторона - верх BR 131330$ 131316$:BIC #40,23204 ; Установить "НИЗ" в УС CLRB 23212 ; Текущая сторона - низ 131330$:BICB #374,23337 ; Оставить биты номера устройства MOVB 23340,23213 ; Переслать номер запрашиваемой дорожки CLR R1 MOVB 23337,R1 ; R1 = номер устройства MOVB 23260(R1),23220 ; Текущее время шага MOVB 23264(R1),23222 ; Текущее время загрузки головки MOVB 23274(R1),23300 ; Текущий параметр SKIP MOVB 23270(R1),23301 ; Текущее число секторов в дорожке TSTB 23341 ; Номер запрашиваемого сектора отрицательный ? BMI 131516$ ; Да CMPB 23341,23301 ; Номер сектора превышает лимит ? BHI 131516$ ; Да CMPB #5,23301 ; В дорожке 5 секторов ? BEQ 131440$ ; Да MOV #2,23250 ; Текущий формат сектора - 512 байт BR 131446$ 131440$:MOV #3,23250 ; Текущий формат сектора - 1024 байт 131446$:MOV 23250,R0 ; R0 = текущий формат сектора MOVB 135426$(R0),23302; (23302) = размер межсекторного промежутка ASL R0 MOV 135412$(R0),23252; (23252) = число слов в секторе CMPB #30,23335 ; Код функции < 30 BHI 131502$ ; Да BR 131542$ 131502$:CLC ; Преобразование адреса для загрузки в 177010 ROR 23342 MOV 23344,R0 ; R0 = число слов для чтения BPL 131530$ ; Оно < 32768 (в норме) 131516$:MOVB #11,23334 ; Ошибочный массив параметров JMP 134422$ 131530$:ADD 23342,R0 ; R0 = число слов + начальный адрес CMP #70000,R0 ; Конец буфера выходит за границу 56 KB ? BLO 131516$ ; Да 131542$:MOVB 23337,R1 ; R1 = номер устройства MOV R1,23206 ADD #23254,23206 ; (23206) = указатель на текущую дорожку JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п .WORD 101,131710$,107 ; по адресу 131710$ BIT #2000,23204 ; Двигатель накопителя еще работает ? BNE 131620$ ; Да BIS #20,23204 ; Установить бит запуска мотора в УС MOV 23216,23224 ; (23224) = время разгона двигателя BR 131652$ 131620$:MOVB 23204,R0 BICB #374,R0 ; R0 = номер выбранного устройства CMPB 135406$(R1),R0 ; Номера выбранного и запрошенного уст-в равны? BNE 131644$ ; Нет CALL 134356$ ; Восстановить РОН BR 131726$ 131644$:MOV 23222,23224 ; (23224) = время загрузки головки 131652$:BIC #3,23204 BISB 135406$(R1),23204; Установить биты номера устройства в УС BIS #2000,23204 ; Установить бит выбора накопителя MOV 23204,@#177130 ; Запуск мотора CALL 134356$ ; Восстановить РОН RTI 131710$:CALL 134242$ ; Сброс готовности программируемого таймера DEC 23224 ; Уменьшить значение счетчика (разгон мотора) BNE 131724$ ; Он еще не равен нулю BR 131726$ 131724$:RTI 131726$:JSR R5,134210$ ; Запуск таймера с последующим вызовом п/п .WORD 101,132074$,107 ; по адресу 132074$ TSTB @23206 ; Текущий номер дорожки определенный ? BPL 132112$ ; Да MOVB #200,@23206 ; Примем в качестве номера дорожки - 128 BIC #100,23204 ; Установить в УС перемещение от центра MOV 23204,@#177130 ; Сообщить об этом контроллеру BIS #200,23204 ; Установить в УС бит шага 131776$:BIT #1,@#177130 ; Головка находится на нулевой дорожке ? BEQ 132022$ ; Нет BIC #200,23204 ; Сбросить в УС бит шага CLRB @23206 ; Текущая дорожка - нулевая BR 132112$ 132022$:DECB @23206 ; Уменьшить номер текущей дорожки BNE 132056$ ; Пока не 0 BIC #200,23204 ; Сбросить в УС бит шага MOVB #377,@23206 ; Номер дорожки - неопределенный MOVB #7,23334 ; Ошибка - нулевая дорожка не обнаружена JMP 134422$ 132056$:MOV 23204,@#177130 ; Сделать шаг назад MOV 23220,23224 ; (23224) = время шага RTI 132074$:CALL 134242$ ; Сбросить готовность программируемого таймера DEC 23224 ; Уменьшить значение счетчика (время шага) BNE 132110$ ; Он не равен нулю BR 131776$ 132110$:RTI 132112$:CMPB @23206,23340 ; Сравнить номера текущей и запрошенной дорожек BEQ 132346$ ; Равны BHI 132164$ ; Больше INCB @23206 ; Увеличить номер текущей дорожки BMI 132152$ ; Он > 127 (ошибка) BIT #100,23204 ; В УС установлен бит перемещения к центру BNE 132246$ ; Да BIS #100,23204 ; Установить в УС бит перемещения к центру BR 132224$ 132152$:MOVB #10,23334 ; Ошибка - дорожка не обнаружена JMP 134422$ 132164$:DECB @23206 ; Уменьшить номер текущей дорожки BIT #1,@#177130 ; Головка находится на нулевой дорожке ? BEQ 132206$ ; Нет CLRB @23206 ; Текущая дорожка - нулевая BR 132112$ 132206$:BIT #100,23204 ; В УС сброшен бит перемещения BEQ 132246$ ; Да BIC #100,23204 ; Сбросить в УС бит перемещения 132224$:MOV 23204,@#177130 ; Извещение контроллера о направлении перемещ. MOV #132242$,@#304 ; Адрес новой п/п обработки прерывания RTI 132242$:CALL 134242$ ; Сбросить готовность программируемого таймера 132246$:MOVB 23300,23246 ; (23246) = текущий параметр SKIP 132254$:MOV 23220,23224 ; (23224) = время шага MOV #132322$,@#304 ; Адрес новой п/п обработки прерывания CALL 132276$ ; Выполнить шаг в выбранном направлении RTI 132276$:BIS #200,23204 ; Установить в УС бит шага MOV 23204,@#177130 ; Выполнить шаг BIC #200,23204 ; Сбросить в УС бит шага RETURN 132322$:CALL 134242$ ; Сбросить готовность программируемого таймера DEC 23224 ; Уменьшить значение счетчика (время шага) BNE 132344$ ; Он не равен нулю DECB 23246 ; Уменьшить параметр пропуска дорожки BNE 132254$ ; Не равен нулю BR 132112$ 132344$:RTI 132346$:BIC #14,23204 ; Очистить в УС биты прекоррекции MOV 23226,23246 ; (23246) = номера дорожек, где вкл. прекорр. CMPB #1,23300 ; Параметр SKIP равен 1 ? BEQ 132402$ ; Да ASRB 23246 ; Уменьшить номера дорожек на 2 ASRB 23247 132402$:CMPB 23246,@23206 ; Надо включать прекоррекцию ? BHI 132440$ ; Нет CMPB 23247,@23206 ; Включать прекоррекцию 500 нс ? BHI 132432$ ; Да BIS #4,23204 ; Установить в УС бит вкл. прекоррекции 250 нс BR 132440$ 132432$:BIS #10,23204 ; Установить в УС бит вкл. прекоррекции 500 нс 132440$:MOV 23204,@#177130 ; Извещение контроллера о вкл. прекоррекции MOV #132456$,@#304 ; Адрес новой п/п обработки прерывания RTI 132456$:CALL 134242$ ; Сбросить готовность программируемого таймера CLRB @#177710 ; Остановить таймер CALL 134316$ ; Сохранить значения РОН MOV #177130,R4 ; R4 = адрес РСУ накопителя MOV R4,R5 TST (R5)+ ; R5 = адрес РД накопителя CMPB #10,23335 ; Запрошено чтение ? BEQ 132570$ ; Да BIT #4,@R4 ; Дискета защищена от записи ? BEQ 132532$ ; Нет MOVB #6,23334 ; Ошибка - защита от записи JMP 134422$ 132532$:CMPB #20,23335 ; Запрошена запись ? BEQ 132570$ CMPB #30,23335 ; Запрошено форматирование дорожки ? BNE 132556$ ; Нет JMP 134474$ 132556$:MOVB #11,23334 ; Ошибка - неверный массив параметров JMP 134422$ 132570$:MOV #36,23224 MOV 23224,R2 MOV 23204,R3 ; R3 = УС MOV #177130,R4 ; R4 = адрес РСУ накопителя MOV R4,R5 TST (R5)+ ; R5 = адрес РД накопителя JSR R5,134210$ ; Запуск таймера .WORD 2465,132630$,7 132630$:MOV @R5,R0 ; Прочесть слово с дискеты BEQ 132640$ ; Это нуль INC R0 BNE 132656$ ; Это не минус один 132640$:TSTB @#177710 ; Таймер окончил счет ? BPL 132630$ ; Нет CALL 134242$ ; Сбросить готовность таймера SOB R2,132630$ BR 132772$ ; Ошибка (не форматирована дискета или ее нет) 132656$:MOV #4,R1 CMPB #5,23301 ; Формат 1024 байта в секторе ? BNE 132702$ ; Нет TST @R4 ; Присутствует линия индекс ? BPL 132702$ ; Нет MOV #36,R1 132702$:MOV @R5,R0 ; Прочесть слово с дискеты BEQ 132730$ ; Это нуль INC R0 BEQ 132730$ ; Это минус один TSTB @#177710 ; Таймер окончил счет BPL 132656$ ; Нет CALL 134242$ ; Сбросить готовность таймера SOB R2,132656$ BR 133002$ ; Ошибка (не найден межсекторный промежуток) 132730$:MOV @R5,R0 ; Прочесть слово с дискеты BEQ 132740$ ; Это нуль INC R0 BNE 132640$ ; Это не минус один 132740$:SOB R1,132730$ BIS #400,R3 ; Установить в УС бит поиска заголовка MOV R3,@R4 ; Начать поиск BIC #400,R3 ; Сбросить в УС бит поиска заголовка MOV #226,R0 ; Время ожидания поиска MOV R3,@R4 132762$:TSTB @R4 ; Маркер заголовка обнаружен ? BMI 133034$ ; Да SOB R0,132762$ BR 132630$ ; Заголовок сектора необнаружен 132772$:MOVB #100,23334 ; Ошибка - не форматирована дискета BR 133030$ 133002$:MOVB #101,23334 ; Ошибка - не обнаружен межсекторный промежуток BR 133030$ 133012$:MOVB #102,23334 ; Ошибка - не найден сектор с заданным номером BR 133030$ 133022$:MOVB #3,23334 133030$:JMP 134422$ 133034$:TST @R5 ; Сбросить готовность контроллера дисковода 133036$:TSTB @R4 ; Следующее слово прочитано ? BPL 133036$ ; Нет CMP #120776,@R5 ; Это адресный маркер заголовка сектора? BEQ 133212$ ; Да MOV #14,R0 133054$:ADD 23252,R0 ASL R0 ASL R0 133064$:CLRB @#177710 MOV R0,@#177712 ; Загрузить буфер таймера CMP R0,@#177714 ; Буфер загружен ? BNE 133064$ ; Нет MOV #133134$,@#304 ; Адрес новой п/п обработки прерываний MOVB #107,@#177710 ; Запустить таймер MOV R3,23204 MOV R2,23224 CALL 134356$ ; Восстановить РОН RTI 133134$:CALL 134242$ ; Сбросить готовность таймера CALL 134316$ ; Сохранить содержимое РОН DEC 23224 ; Уменьшить счетчик (число оборотов диска) BLE 133012$ ; Он равен нулю (ошибка) MOV #2465,@#177712 ; Загрузить буфер таймера временем оборота MOV #7,@#177710 ; Перевести таймер в режим "ПУСК" (без прерыв.) MOV 23224,R2 ; R2 = значение счетчика MOV 23204,R3 ; R3 = УС MOV #177130,R4 ; R4 = адрес РСУ накопителя MOV R4,R5 TST (R5)+ ; R5 = адрес РД накопителя JMP 134100$ ; На поиск заголовка сектора 133212$:TSTB @R4 ; Очередное слово сформировано ? BPL 133212$ ; Нет MOV @R5,23246 ; Прочесть его CMP 23212,23246 ; Это идентификатор стороны и дорожки ? BEQ 133276$ ; Да 133232$:TSTB @R4 ; Очередное слово сформировано ? BPL 133232$ ; Нет TST @R5 ; Игнорировать прочитанное слово(номер сектора) CALL 134300$ ; Контрольная сумма в порядке ? BEQ 133270$ ; Нет MOV R3,23204 ; Сохранить УС CALL 134356$ ; Восстановить РОН MOVB #377,@23206 ; Поставить номер неопределенной дорожки JMP 131726$ 133270$:MOV #40,R0 BR 133054$ 133276$:TSTB @R4 ; Очередное слово сформировано ? BPL 133276$ ; Нет MOV @R5,R0 ; R0 = прочитанное слово SWAB R0 CMPB 23341,R0 ; Номер сектора совпадает ? BNE 133270$ ; Нет MOV 23344,R2 ; R2 = число слов для обмена MOV 23342,@#177010 ; Адрес буфера ОЗУ ЦП CALL 134300$ ; Контрольная сумма в порядке ? BNE 133344$ ; Да MOVB #2,23334 ; Ошибка в контрольной сумме заголовка BR 133030$ 133344$:CMPB #10,23335 ; Задана операция чтения ? BNE 133506$ ; Нет TST @R5 ; Сбросить готовность контроллера MOV #21,R1 CALL 134132$ ; Поиск пропуска синхроимпульсов BEQ 133476$ ; Не найдено 133370$:TSTB @R4 ; Очередное слово сформировано ? BPL 133370$ ; Нет CMP #120773,@R5 ; Это маркер данных ? BNE 133476$ ; Нет MOV 23252,R1 ; R1 = число слов в секторе TST R2 ; Надо прочитать 0 слов ? BEQ 133442$ ; Да (сделать проверку КС сектора) 133412$:TSTB @R4 ; Очередное слово сформировано ? BPL 133412$ ; Нет MOV @R5,R0 ; Прочитать его SWAB R0 MOV R0,@#177014 ; Переслать в ОЗУ ЦП INC @#177010 ; Переход к следующему адресу DEC R2 ; Уменьшить счетчик считываемых слов BEQ 133450$ ; Все прочитали SOB R1,133412$ ; Цикл по числу слов в секторе BR 133452$ 133442$:TSTB @R4 ; Очередное слово сформировано ? BPL 133442$ TST @R5 ; Пропуск конца сектора 133450$:SOB R1,133442$ ; Цикл по числу слов в секторе 133452$:MOV R2,23344 ; Сохранить число оставшихся слов CALL 134300$ ; Контрольная сумма в порядке ? BNE 133706$ ; Да MOVB #1,23334 ; Ошибка в контрольной сумме зоны данных 133472$:JMP 133030$ 133476$:MOVB #4,23334 ; Не найден маркер данных BR 133472$ 133506$:TST R2 ; Счетчик записываемых слов равен нулю ? BNE 133516$ ; Нет JMP 134416$ ; Да 133516$:MOV #47116,@R5 ; Запись межсекторного промежутка MOV #13,R0 ; R0 = размер межсекторного пром. перед данными 133526$:TSTB @R4 ; Предыдущее слово записано ? BPL 133526$ ; Нет MOV #47116,@R5 ; Запись межсекторного промежутка SOB R0,133526$ MOV #6,R0 ; R0 = размер нулевой зоны 133544$:TSTB @R4 ; Очередное слово записано ? BPL 133544$ ; Нет MOV #0,@R5 ; Запись нулевой зоны SOB R0,133544$ BIS #1000,R3 ; Установить бит пропуска синхроимпульсов 133562$:TSTB @R4 ; Очередное слово записано ? BPL 133562$ ; Нет MOV #120641,@R5 ; Запись первого слова маркера данных MOV R3,@R4 ; Установить пропуск синхроимпульсов BIC #1000,R3 ; Сбросить бит пропуска синхроимпульсов 133600$:TSTB @R4 ; Очередное слово записано ? BPL 133600$ ; Нет MOV #175641,@R5 ; Запись второго слова маркера данных MOV 23252,R1 ; R1 = размер сектора в словах DEC R1 133616$:TSTB @R4 ; Очередное слово записано ? BPL 133616$ MOV @#177014,@R5 ; Запись первого слова данных MOV R3,@R4 ; Сброс пропуска синхроимпульсов INC @#177010 ; Переход к следующему адресу DEC R2 ; Уменьшить счетчик записываемых слов BEQ 133664$ 133640$:TSTB @R4 ; Очередное слово записано ? BPL 133640$ ; Нет MOV @#177014,@R5 ; Запись данных INC @#177010 ; Переход к следующему адресу DEC R2 ; Уменьшить счетчик записываемых слов BEQ 133674$ SOB R1,133640$ BR 133676$ 133664$:TSTB @R4 ; Очередное слово записано ? BPL 133664$ ; Нет MOV #0,@R5 ; Запись нуля 133674$:SOB R1,133664$ 133676$:MOV R2,23344 ; Сохранить счетчик записываемых слов CALL 134256$ ; Запись контрольной суммы 133706$:TST 23344 ; Счетчик записываемых слов равен нулю BNE 133720$ ; Нет JMP 134416$ ; Да 133720$:MOV @#177010,23342 ; Сохранение регистра адреса INCB 23341 ; Увеличить номер текущего сектора CMPB 23341,23301 ; Он превышает номер последнего сектора ? BLOS 134064$ ; Нет CMPB #1,23336 ; Запрошена односторонняя операция ? BEQ 133766$ ; Да BIT #40,R3 ; Текущая сторона - верх ? BNE 133766$ ; Да INC 23212 ; Увеличить номер текущей стороны BR 134010$ 133766$:INCB 23340 ; Увеличить номер запрашиваемой дорожки MOVB 23340,23212 SWAB 23212 CLRB 23212 ; Текущая сторона - низ 134010$:CLRB @#177710 ; Остановить программируемый таймер TST @#177714 ; Сбросить его готовность TST @#177714 MOVB #1,23341 ; Текущий номер сектора - 1 CMPB #1,23336 ; Запрошена односторонняя операция BEQ 134050$ ; Да MOV #40,R0 XOR R0,R3 ; Переменить сторону 134050$:MOV R3,23204 CALL 134356$ ; Восстановить РОН JMP 131726$ 134064$:TST @#177714 ; Сбросить готовность программируемого таймера TST @#177714 MOV #36,R2 134100$:TST @R5 ; Перевод контроллера в режим чтения CLR R1 MOVB 23302,R1 ; R1 = текущий размер межсекторного промежутка ADD #6,R1 CALL 134132$ ; Поиск нулевой зоны и начала след. сектора BEQ 134126$ ; Она не найдена JMP 133036$ 134126$:JMP 132630$ ; П/п поиска нулевой зоны 134132$:TSTB @R4 ; Очередное слово считано ? BPL 134132$ ; Нет MOV @R5,R0 BEQ 134152$ ; Это нулевая зона INC R0 BEQ 134152$ SOB R1,134132$ BR 134200$ 134152$:BIS #400,R3 ; Уст. бит поиска пропуска синхроимпульсов MOV R3,@R4 ; Начать поиск BIC #400,R3 ; Сбросить бит поиска пропуска синхроимпульсов MOV #226,R0 MOV R3,@R4 134172$:TSTB @R4 ; Поиск окончен BMI 134204$ ; Да SOB R0,134172$ 134200$:SEZ ; Операция окончилась неуспешно RETURN 134204$:TST @R5 RETURN ; П/п запуска таймера с вызовом п/п по его прерыванию 134210$:CLRB @#177710 ; Остановить программируемый таймер MOV @R5,@#177712 ; Занести в буфер временную задержку CMP @R5,@#177714 BNE 134210$ TST (R5)+ MOV (R5)+,@#304 ; Занести адрес п/п в вектор прерывания MOV (R5)+,@#177710 ; Запустить таймер RTS R5 ; П/п сброса готовности программируемого таймера 134242$:TST @#177714 ; Сбросить готовность таймера TSTB @#177710 ; Она сброшена ? BMI 134242$ ; Нет RETURN ; П/п записи контрольной суммы 134256$:BIT #40000,@R4 ; Запись КС BEQ 134256$ MOV #47116,@R5 134270$:TSTB @R4 BPL 134270$ TST @R5 RETURN ; П/п проверки контрольной суммы 134300$:MOV #36,R0 134304$:BIT #40000,@R4 ; Проверка КС BNE 134314$ SOB R0,134304$ 134314$:RETURN ; П/п сохранения РОН 134316$:MOV R0,23232 MOV R1,23234 MOV R2,23236 MOV R3,23240 MOV R4,23242 MOV R5,23244 MOV @#177010,23230 RETURN ; П/п восстановления РОН 134356$:MOV 23232,R0 MOV 23234,R1 MOV 23236,R2 MOV 23240,R3 MOV 23242,R4 MOV 23244,R5 MOV 23230,@#177010 RETURN ; Завершающая процедура 134416$:CLRB 23334 ; Код ошибки = 0 (все нормально) 134422$:CALL 125140$ ; Переслать код возврата в ЦП JSR R5,175400$ ; Установить адрес п/п выключения двигателя .WORD 372,134454$ CALL 134356$ ; Восстановить РОН CLR @#177710 ; Остановить таймер CALL 176422$ RTI ; П/п останова двигателя 134454$:BIC #2037,23204 ; Сбросить биты выбора устройства,вкл. мотора MOV 23204,@#177130 ; Выключить двигатель RETURN 134472$:BR 134416$ ; Форматирование дорожки 134474$:MOV 23204,R3 ; R3 = УС накопителя MOV #177130,R4 ; R4 = адрес РУС накопителя MOV R4,R5 TST (R5)+ ; R5 = адрес РД накопителя SWAB 23212 MOVB 23341,R2 ; R2 = формат сектора BIC #177774,R2 BNE 134540$ MOV #13,23334 ; Ошибка = неверный формат сектора JMP 134422$ 134540$:MOVB 135422$(R2),23246; (23246) = число секторов в дорожке MOVB 135426$(R2),23302; (23302) = размер межсекторного промежутка MOV R2,R1 ASL R1 MOV 135412$(R1),R1 ; R1 = число слов в секторе SWAB R2 INC R2 ; R2 = формат сектора : номер сектора MOV #1750,R0 134574$:TST @R4 ; Присутствует линия ИНДЕКС ? BPL 134616$ ; Нет SOB R0,134574$ 134602$:TST @R5 ; Установить режим готовности чтения MOVB #14,23334 ; Ошибка = ошибка линии ИНДЕКС JMP 134422$ 134616$:MOV #6200,R0 ; R0 = число слов в дорожке MOV #47116,@R5 ; Заполнение дорожки 134626$:TST @R4 ; Присутствует линия ИНДЕКС ? BMI 134646$ 134632$:TSTB @R4 ; Предыдущее слово записано ? BPL 134632$ ; Да MOV #47116,@R5 ; Заполнение дорожки SOB R0,134626$ BR 134602$ 134646$:MOV #20,R0 ; R0 = размер межсект. пром. в начале дорожки 134652$:MOV #47116,@R5 ; Заполнение межсект. пром. перед заголовком 134656$:TSTB @R4 ; Очередное слово записано ? BPL 134656$ ; Нет MOV #47116,@R5 ; Заполнение межсект. пром. перед заголовком SOB R0,134656$ MOV #6,R0 ; R0 = размер нулевой зоны 134674$:TSTB @R4 ; Очередное слово записано ? BPL 134674$ ; Нет MOV #0,@R5 ; Заполнение нулевой зоны SOB R0,134674$ BIS #1000,R3 ; Установить бит пропуска синхроимпульсов 134712$:TSTB @R4 BPL 134712$ MOV #120641,@R5 ; Запись первого слова адресного маркера MOV R3,@R4 ; Установить режим пропуска синхроимпульсов BIC #1000,R3 ; Сбросить бит пропуска синхроимпульсов 134730$:TSTB @R4 BPL 134730$ MOV #177241,@R5 ; Запись второго слова адресного маркера 134740$:TSTB @R4 BPL 134740$ MOV 23212,@R5 ; Запись номера дорожки и стороны MOV R3,@R4 ; Сбросить режим пропуска синхроимпульсов 134752$:TSTB @R4 BPL 134752$ MOV R2,@R5 ; Запись номера сектора и формата сектора MOV #13,R0 ; R0 = размер межсект. пром. перед данными 134764$:BIT #40000,@R4 ; Запись контрольной суммы BEQ 134764$ MOV #47116,@R5 ; Заполнение межсект. пром. перед данными 134776$:TSTB @R4 BPL 134776$ MOV #47116,@R5 ; Заполнение межсект. пром. перед данными SOB R0,134776$ MOV #6,R0 ; R0 = размер нулевой зоны 135014$:TSTB @R4 BPL 135014$ MOV #0,@R5 ; Заполнение нулевой зоны SOB R0,135014$ BIS #1000,R3 ; Установить бит пропуска синхроимпульсов 135032$:TSTB @R4 BPL 135032$ MOV #120641,@R5 ; Запись первого слова маркера данных MOV R3,@R4 ; Установить режим пропуска синхроимпульсов BIC #1000,R3 ; Сбросить бит пропуска синхроимпульсов 135050$:TSTB @R4 BPL 135050$ MOV #175641,@R5 ; Запись второго слова маркера данных MOV R1,R0 ; R0 = размер сектора в словах 135062$:TSTB @R4 BPL 135062$ MOV 23342,@R5 ; Запись первого слова зоны данных MOV R3,@R4 ; Сбросить режим пропуска синхроимпульсов DEC R0 135076$:TSTB @R4 BPL 135076$ MOV 23342,@R5 ; Заполнение зоны данных SOB R0,135076$ INC R2 ; Увеличить номер сектора MOVB 23302,R0 ; R0 = размер межсект. пром. перед заголовком 135116$:BIT #40000,@R4 ; Запись контрольной суммы BEQ 135116$ DECB 23246 ; Уменьшить счетчик секторов BNE 134652$ MOV #1750,R0 135136$:TST @R4 ; Присутствует линия ИНДЕКС ? BMI 135170$ ; Да 135142$:TSTB @R4 BPL 135142$ MOV #47116,@R5 ; Заполнение конца дорожки SOB R0,135136$ TST @R5 ; Установить режим готовности чтения MOVB #14,23334 ; Ошибка - ошибка линии ИНДЕКС JMP 134422$ 135170$:MOV #5,R0 135174$:TSTB @R4 BPL 135174$ MOV #47116,@R5 ; Заполнение в начале первых пяти слов SOB R0,135174$ TST @R5 ; Установить режим готовности чтения JMP 134416$ ; П/п-мы установок параметров 135214$:CLR R0 MOVB 23335,R0 ; R0 = номер устанавливаемого параметра (1 - 4) CMP #4,R0 ; Он в диапазоне (1 - 4) ? BHIS 135242$ ; Да MOVB #11,23334 ; Ошибка - неверный массив параметров JMP 134422$ 135242$:MOVB 23340,23246 ; (23246) = значение устанавливаемого параметра DEC R0 MOV #135272$,R1 ADD R0,R1 ADD R0,R1 MOV @R1,R1 CALL @R1 ; Вызов соответствующей п/п JMP 134416$ ; Адреса начала п/п установки значений параметров 135272$:.WORD 135350$,135356$,135364$,135372$ 135302$:MOVB 23337,R0 ; R0 = номер накопителя CMPB #377,R0 ; Устанавливается для всех накопителей ? BEQ 135326$ ; Да MOV #1,R2 ; R2 = число накопителей, для кот. уст. парам. BICB #374,R0 BR 135334$ 135326$:CLR R0 MOV #4,R2 ; R2 = число накопителей, для кот. уст. парам. 135334$:ADD R0,R1 ; Корректировка под номер накопителя 135336$:MOVB 23246,@R1 ; Установка нового значения INC R1 SOB R2,135336$ RETURN 135350$:MOV #23260,R1 ; R1 = адрес буфера времен шага BR 135302$ 135356$:MOV #23264,R1 ; R1 = адрес буфера времен загрузки головки BR 135302$ 135364$:MOV #23270,R1 ; R1 = адрес буфера числа секторов в дорожке BR 135302$ 135372$:MOV #23274,R1 ; R1 = адрес буфера параметра SKIP MOV #2,23246 ; Принудительная установка пропуска дорожки BR 135302$ ; Устанавливаемые биты в РУС накопителя при выборе соотв. устройства 135406$:.BYTE 3,2,1,0 ; Число слов в секторе (формат x,256,512,1024 байт) 135412$:.WORD 0,200,400,1000 ; Число секторов в дорожке (формат x,256,512,1024 байт) 135422$:.BYTE 0,20,12,5 ; Размер межсекторного промежутка перед заголовком (формат x,256,512,1024 байт) 135426$:.BYTE 0,33,22,72 135432$:.BYTE 0,240,124,242