From Felixl.com
; ******************************************************
; * *
; * ДРАЙВЕР КАНАЛА 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