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