![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
SuperMax |
![]()
Сообщение
#1
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 342 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Код .TITLE ROM .ASECT .=100000 ; Начальный адрес ПЗУ ; ******************************************************************** ; * * ; * ПОДПРОГРАММЫ ОБСЛУЖИВАНИЯ МЕНЮ УСТАНОВКА И ЗАГРУЗКА * ; * * ; * Адреса 100000 - 103553 * ; * * ; ******************************************************************** ; П/п установки начальных значений в меню УСТАНОВКА и ЗАГРУЗКА 100000$:JSR R5,110712$ ; П/п заносит данные из области .WORD 100012$,7152 ; по адресу 100012 в 7152 RETURN 100012$:.WORD 10. ; Количество слов .WORD 177701,0,0 ; Пункт УСТ не выбран, VT-52, 80x24 .WORD 7,1,1,7 ; Цвета символа, знакоместа, экрана и курсора .WORD 0,0 ; Рулон плавный, таймер включен .WORD 177701 ; Пункт ЗАГРУЗКА не выбран ; П/п обслуживания главного меню УСТАНОВКА 100040$:TST @#23170 ; Ожидание завершения скроллинга BNE 100040$ MOV @#2476,-(SP) ; Сохранить адрес пользовательского экрана MOV #4672,@#2476 ; Включить экран установки MOV #22754,R5 ; Сделать текущей таблицу видеопараметров CALL 110210$ ; экрана установки JSR R5,105346$ ; Перевести клавиатуру в системный режим .WORD 107310$,11054 ; Данные для системного режима CALL 104054$ ; Очистить буфер клавиатуры CLR @#7232 ; Разрешение алфавитно-цифровой клавиатуры MOV SP,@#7142 EMT 52 ; Вывод УСТ в верхней строке .WORD 107533$ 100120$:EMT 44 ; Вывод заголовка .WORD 102133$ 100124$:MOV #4,R0 JSR R4,101202$ ; Вывод меню и запрос пункта .WORD 101644$ ; Адрес списка для меню УСТАНОВКА BMI 100172$ ; Нажата <Enter> или УПР-@ ? CALL @100150$(R2) ; Обслуживание выбранного пункта BMI 100172$ ; Нажата <Enter> или УПР-@ ? BR 100124$ ; Адреса п/п обслуживания пунктов меню УСТАНОВКА 100150$:.WORD 100172$,100334$,100372$,100432$,100476$ .WORD 100536$,100576$,100630$,100730$ ; Если нажаты <Enter> или УПР-@ 100172$:CMP R0,#177772 ; Нажата УПР-@ (выход в монитор ПП) ? BEQ 100302$ MOV @#7142,SP EMT 52 ; Стирание в верхней строке надписи УСТ .WORD 107524$ EMT 52 .WORD 107542$ TST @#7146 ; Предыдущий режим клавиатуры был системным ? BNE 100232$ ; Да JSR R5,105400$ ; Восстановить пользовательский режим .WORD 107310$,11054 ; Данные для пользовательского режима 100232$:CALL 110204$ ; Включение пользовательского экрана MOV (SP)+,@#2476 CLR @#7070 ; Очистить признак вызова TST @#7072 ; Вызов происходил из меню ЗАГРУЗКА ? BNE 100300$ ; Да 100254$:MOV #2,@#7230 ; Установить признак выполнения TRAP 2 MOV #2,@#22546 ; Установить признак выполнения TRAP 4 MOV #2,@#7042 ; Адресовать ASCII-коды клавиатуры каналу 0 TRAP 4 ; Прочесть символ с канала 0 (если есть) 100300$:RETURN 100302$:MOV #14,R0 ; Очистить экран EMT 42 MOV #100120$,-(SP) ; Адрес возврата в меню УСТАНОВКА MOV SP,@#7144 JMP @#160576 ; Переход к программе монитора ПП ; П/п обслуживания подменю СИСТЕМА КОМАНД 100324$:CALL @100346(R2) ; Вызов п/п по текущему пункту меню MOV #4,R0 100334$:JSR R4,101202$ ; Вывод подменю и запрос пункта .WORD 101672$ ; Адрес списка подменю СИСТЕМА КОМАНД BEQ 100324$ RETURN ; Адреса п/п для обслуживания подменю СИСТЕМА КОМАНД 100346$:.WORD 162572$,113670$,113712$ ; П/п обслуживания подменю ФОРМАТ ЭКРАНА 100354$:MOV R2,R0 ; Получение номера формата ASR R0 ; 0 - 80x24, 1 - 40x24, 2 - 20x24, 3 - 10x24 DEC R0 CALL 116502$ ; Обращение к п/п установки формата экрана MOV #2,R0 100372$:JSR R4,101202$ ; Вывод меню и запрос пункта .WORD 101704$ ; Адрес списка подменю ФОРМАТ ЭКРАНА BEQ 100354$ RETURN ; П/п для обслуживания подменю ЦВЕТ СИМВОЛА 100404$:MOV R2,R0 ; Получение номера цвета ASR R0 DEC R0 MOV R5,-(SP) ; Сохранить адрес текущей таблицы видеопар. MOV #22656,R5 ; Загрузить адрес таблицы экрана пользователя CALL 116052$ ; Обращение к п/п установки цвета символа MOV (SP)+,R5 MOV #2,R0 100432$:JSR R4,101202$ ; Вывод меню и запрос пункта .WORD 101722$ ; Адрес списка подменю ЦВЕТ СИМВОЛА BEQ 100404$ RETURN ; П/п для обслуживания подменю ЦВЕТ ЗНАКОМЕСТА 100444$:MOV R2,R0 ; Получение номера цвета SUB #2,R0 MOV 113512$(R0),R0 MOV R5,-(SP) MOV #22656,R5 CALL 116130$ ; Обращение к п/п установки цвета знакоместа MOV (SP)+,R5 MOV #2,R0 100476$:JSR R4,101202$ .WORD 101750$ ; Адрес списка подменю ЦВЕТ ЗНАКОМЕСТА BEQ 100444$ RETURN ; П/п для обслуживания подменю ЦВЕТ ЭКРАНА 100510$:MOV R2,R0 ; Получение номера цвета ASR R0 DEC R0 MOV R5,-(SP) MOV #22656,R5 CALL 116170$ ; Обращение к п/п установки цвета экрана MOV (SP)+,R5 MOV #2,R0 100536$:JSR R4,101202$ .WORD 101776$ ; Адрес списка подменю ЦВЕТ ЭКРАНА BEQ 100510$ RETURN ; П/п для обслуживания подменю ЦВЕТ КУРСОРА 100550$:MOV R2,R0 ; Получение номера цвета ASR R0 DEC R0 MOV R5,-(SP) MOV #22656,R5 CALL 116226$ ; Обращение к п/п установки цвета курсора MOV (SP)+,R5 MOV #2,R0 100576$:JSR R4,101202$ .WORD 102024$ ; Адрес списка подменю ЦВЕТ КУРСОРА BEQ 100550$ RETURN ; П/п для обслуживания подменю РУЛОН 100610$:MOV R5,-(SP) MOV #22656,R5 CALL @<100642$-2>(R2); Обращение к п/п-ам установки рулона MOV (SP)+,R5 MOV #2,R0 100630$:JSR R4,101202$ .WORD 102052$ ; Адрес списка подменю РУЛОН BEQ 100610$ RETURN ; Адреса п/п-ам для установки рулона 100642$:.WORD 100650$,100656$,100674$ 100650$:CLR @#7136 ; Установить плавный рулон BR 100664$ 100656$:MOV #2,@#7136 ; Установить дискретный рулон 100664$:MOV #2,74(R5) ; Установить присутствие рулона RETURN ; 74 - смещение в таблице видеопараметров 100674$:CLR 74(R5) ; Установить отсутствие рулона RETURN ; П/п для обслуживания подменю ТАЙМЕР 100702$:BIS #1000,@#177054 ; Выключить таймер в канале ЦП SUB #2,R2 ; Текущий пункт - включен ? BNE 100724$ ; Нет BIC #1000,@#177054 ; Включить таймер в канале ЦП 100724$:MOV #2,R0 100730$:JSR R4,101202$ .WORD 102066$ ; Адреса списка подменю ТАЙМЕР BEQ 100702$ RETURN ; П/п обслуживания главного меню ЗАГРУЗКА 100742$:CLR @#7042 ; Направлять ASCII-коды запросам EMT 22 CLR -(SP) ; Номер устройства = 0 100750$:MOV #14,R0 ; Очистить экран EMT 42 100756$:CLR @SP JSR R4,101616$ ; Позиционирование курсора .BYTE 2,5 ; Y=2, X=5 MOV #-6,@#7150 ; Запрет вывода в верхнюю инф. строку CLR @#23164 ; Разрешение использования курсора EMT 44 ; Вывод заголовка .WORD 103114$ 101004$:MOV #4,R0 JSR R4,101202$ ; Вывод меню и запрос пункта .WORD 102100$ ; Адрес списка меню ЗАГРУЗКА BEQ 100756$ BMI 101146$ ; Нажаты <Enter>,<ИСП> или <0> ? ADD R2,PC ; Переход по номеру пункта (нажата вправо) BR 100756$ BR 101044$ ; Диск BR 101102$ ; Кассета ПЗУ BR 101004$ ; Сеть BR 101004$ ; Стык С2 BR 101004$ ; Магнитофон BR 101004$ ; Отладка BR 101004$ ; Тестирование ; Запрос номера диска 101044$:JSR R4,101616$ ; Позиционирование курсора .BYTE 4,34 EMT 22 ; Ввод символа с ожиданием CMP R0,#33 ; Код Escape ? BEQ 101142$ ; Да EMT 42 ; Вывод символа SUB #60,R0 ; Проверка нажатия <0> - <3> BMI 100756$ CMP R0,#3 BHI 100756$ BR 101136$ ; Запрос номера кассеты ПЗУ 101102$:JSR R4,101616$ ; Позиционирование курсора .BYTE 5,34 EMT 22 ; Ввод символа с ожиданием CMP R0,#33 ; Код Escape ? BEQ 101142$ ; Да EMT 42 ; Вывод символа SUB #61,R0 ; Проверка нажатия <1>,<2> BMI 100756$ CMP R0,#1 BHI 100756$ 101136$:MOV R0,@SP ; Сохранение номера устройства BR 101004$ 101142$:EMT 22 BR 100750$ 101146$:MOV #14,R0 ; Очистка экрана EMT 42 CALL 100254$ ; Восстановить пользовательский режим MOV R2,R0 ; Занести номер пункта в буфер клавиатуры CALL 104160$ MOVB (SP)+,R0 ; Занести номер устройства в буфер клавиатуры CALL 104160$ CLR @#7072 ; Очистить признак вызова RETURN ; П/п вывода пунктов меню и запроса номера пункта 101202$:MOV #-6,@#7150 ; Запрет вывода в верхнюю инф. строку MOV R0,-(SP) CALL 101446$ ; Вывод пунктов меню ADD (SP)+,PC BR 101432$ BR 101224$ 101224$:MOV @R4,R0 ; Позиционирование курсора MOV 2(R0),R3 ; R3 = координаты DEC R3 CALL 101564$ MOV @R4,R3 ; R3 = адрес списка 101242$:EMT 22 ; Ввод символа с ожиданием TST R0 ; Нажата УПР-@ ? BEQ 101436$ CMP R0,#33 ; Символ Escape ? BEQ 101306$ SUB #60,R0 ; Символы <0> - <9> ? BMI 101276$ BEQ 101442$ ; Символ <0> ? CMP R0,@R3 ; Не превышает номер последнего пункта ? BHI 101242$ MOV R0,R2 ; R2 = номер выбранного пункта BR 101404$ 101276$:ADD #43,R0 ; Нажата <Enter> (15(8)-60(8)+43(8)=0) ? BEQ 101442$ BR 101404$ 101306$:EMT 22 SUB #176,R0 ; Нажаты <ПОМ>,<ИСП> или стрелки BMI 101242$ CMP R0,#6 BHIS 101242$ ASL R0 ADD R0,PC BR 101344$ ; <ПОМ> BR 101436$ ; <ИСП> BR 101362$ ; <Вверх> BR 101372$ ; <Вниз> BR 101436$ ; <Влево> BR 101436$ ; <Вправо> 101344$:MOV #20,R3 ; Позиционирование курсора CALL 101564$ EMT 44 ; Вывод краткого хелпинга .WORD 103406$ ; Адрес начала хелпинга BR 101224$ 101362$:DEC R2 ; Уменьшить номер пункта BGT 101404$ MOV @R3,R2 ; R2 = номер последнего пункта BR 101404$ 101372$:INC R2 ; Увеличить номер пункта CMP R2,@R3 ; Превысил номер последнего пункта ? BLOS 101404$ MOV #1,R2 101404$:MOV R2,@4(R3) ; Запомнить номер текущего пункта DEC @4(R3) CLR R0 101416$:TST (R4)+ CLR @#7150 ; Разрешение вывода в верхнюю инф. строку ASL R2 TST R0 RTS R4 101432$:MOV #10,R0 101436$:SUB #5,R0 101442$:DEC R0 BR 101416$ ; П/п вывода пунктов меню 101446$:CLR @#23164 ; Запрет использования курсора MOV @R4,R2 MOV (R2)+,-(SP) ; Число пунктов меню MOV (R2)+,R3 ; Координаты курсора ADD R3,@SP MOV @(R2)+,-(SP) ; Номер текущего пункта меню ADD R3,@SP TST R0 BNE 101502$ CALL 101564$ ; Курсор в начало экрана EMT 44 ; Стирание правой части экрана .WORD 103364$ 101502$:CALL 101564$ CMP R3,@SP ; Номер выводимого пункта совпадает с текущим ? BNE 101516$ EMT 44 ; Включить режим инверсии .WORD 102124$ 101516$:MOV (R2)+,R1 ; Вывод очередного пункта EMT 46 CMP R3,@SP ; Номер выводимого пункта совпадает с текущим ? BNE 101532$ EMT 44 ; Выключить режим инверсии .WORD 102127$ 101532$:INC R3 ; Переход к очередному пункту CMP R3,2(SP) ; Вывод завершен ? BLO 101502$ ; Нет CMP (SP)+,(SP)+ MOV @R4,R0 MOV @4(R0),R2 ; R2 = номер текущего пункта INC R2 MOV #2,@#23164 ; Разрешить использование курсора RETURN ; Следующие две п/п осуществляют позиционирование курсора ; В первой п/п координаты задаются в R3, во второй - в слове, ; которое следует за командой вызова п/п (JSR R4,101616$). 101564$:MOV @#23150,R5 ; R5 = адрес таблицы видеопараметров MOVB R3,R0 ; R0 = Y (строка) CALL 115720$ ; Позиционирование по строке SWAB R3 MOVB R3,R0 ; R0 = X (столбец) CALL 115672$ ; Позиционирование по столбцу SWAB R3 INC @#7066 ; Установить признак перемещения курсора RETURN 101616$:MOV @#23150,R5 ; R5 = адрес таблицы видеопараметров MOVB (R4)+,R0 ; R0 = Y (строка) CALL 115720$ ; Позиционирование по строке MOVB (R4)+,R0 ; R0 = X (столбец) CALL 115672$ ; Позиционирование по столбцу INC @#7066 ; Установить признак перемещения курсора RTS R4 ; СПИСКИ ПУНКТОВ МЕНЮ ; Структура списка: ; первое слово - число пунктов меню ; второе слово - координаты курсора ; третье слово - адрес ячейки, в которой сохраняется номер тек. пункта ; далее - адреса надписей пунктов меню ; Список главного меню УСТАНОВКА 101644$:.WORD 10 .BYTE 4,0 .WORD 7152,102165$,102211$,102235$,102261$ .WORD 102305$,102331$,102355$,102401$ ; Список меню СИСТЕМА КОМАНД 101672$:.WORD 2 .BYTE 4,30 .WORD 7154,102425$,102445$ ; Список меню ФОРМАТ ЭКРАНА 101704$:.WORD 4 .BYTE 4,30 .WORD 7156,102465$,102477$,102511$,102523$ ; Список меню ЦВЕТ СИМВОЛА 101722$:.WORD 10 .BYTE 4,30 .WORD 7160,102535$,102562$,102607$,102634$ .WORD 102661$,102706$,102733$,102760$ ; Список меню ЦВЕТ ЗНАКОМЕСТА 101750$:.WORD 10 .BYTE 4,30 .WORD 7162,102535$,102562$,102607$,102634$ .WORD 102661$,102706$,102733$,102760$ ; Список меню ЦВЕТ ЭКРАНА 101776$:.WORD 10 .BYTE 4,30 .WORD 7164,102535$,102562$,102607$,102634$ .WORD 102661$,102706$,102733$,102760$ ; Список меню ЦВЕТ КУРСОРА 102024$:.WORD 10 .BYTE 4,30 .WORD 7166,102535$,102562$,102607$,102634$ .WORD 102661$,102706$,102733$,102760$ ; Список меню РУЛОН 102052$:.WORD 3 .BYTE 4,30 .WORD 7170,103005$,103024$,103043$ ; Список меню ТАЙМЕР 102066$:.WORD 2 .BYTE 4,30 .WORD 7172,103062$,103077$ ; Список меню ЗАГРУЗКА 102100$:.WORD 7 .BYTE 4,2 .WORD 7174,103175$,103216$,103237$,103260$ .WORD 103301$,103322$,103343$ ; Esc-последовательность включения инверсии 102124$:.BYTE 33,243,0 ; Esc-последовательность выключения инверсии 102127$:.BYTE 33,277,243,0 ; Заголовок меню УСТАНОВКА 102133$:.BYTE 14,12,40,33,244 .ASCII /УСТАНОВКА РЕЖИМОВ/ .BYTE 33,277,244,0 ; Надписи меню УСТАНОВКА 102165$:.ASCIZ /1 - система команд / 102211$:.ASCIZ /2 - формат экрана / 102235$:.ASCIZ /3 - цвет символа / 102261$:.ASCIZ /4 - цвет знакоместа/ 102305$:.ASCIZ /5 - цвет экрана / 102331$:.ASCIZ /6 - цвет курсора / 102355$:.ASCIZ /7 - рулон / 102401$:.ASCIZ /8 - таймер / ; Надписи меню СИСТЕМА КОМАНД 102425$:.ASCIZ /1 - VT-52 / 102445$:.ASCIZ /2 - 15ИЭ-00-013/ ; Надписи меню ФОРМАТ ЭКРАНА 102465$:.ASCIZ /1 - 80/<220>/24/ 102477$:.ASCIZ /2 - 40/<220>/24/ 102511$:.ASCIZ /3 - 20/<220>/24/ 102523$:.ASCIZ /4 - 10/<220>/24/ ; Надписи меню ЦВЕТ СИМВОЛА, ЦВЕТ ЗНАКОМЕСТА, ЦВЕТ ЭКРАНА, ЦВЕТ КУРСОРА 102535$:.BYTE '1,40,'-,40,33,240,'0,33,241,'0 .BYTE 237,237,237,237,33,277,240,33,277,241,0 102562$:.BYTE '2,40,'-,40,33,240,'1,33,241,'1 .BYTE 237,237,237,237,33,277,240,33,277,241,0 102607$:.BYTE '3,40,'-,40,33,240,'2,33,241,'2 .BYTE 237,237,237,237,33,277,240,33,277,241,0 102634$:.BYTE '4,40,'-,40,33,240,'3,33,241,'3 .BYTE 237,237,237,237,33,277,240,33,277,241,0 102661$:.BYTE '5,40,'-,40,33,240,'4,33,241,'4 .BYTE 237,237,237,237,33,277,240,33,277,241,0 102706$:.BYTE '6,40,'-,40,33,240,'5,33,241,'5 .BYTE 237,237,237,237,33,277,240,33,277,241,0 102733$:.BYTE '7,40,'-,40,33,240,'6,33,241,'6 .BYTE 237,237,237,237,33,277,240,33,277,241,0 102760$:.BYTE '8,40,'-,40,33,240,'7,33,241,'7 .BYTE 237,237,237,237,33,277,240,33,277,241,0 ; Надписи меню РУЛОН 103005$:.ASCIZ /1 - плавный / 103024$:.ASCIZ /2 - дискретный/ 103043$:.ASCIZ /3 - выключен / ; Надписи меню ТАЙМЕР 103062$:.ASCIZ /1 - включен / 103077$:.ASCIZ /2 - выключен/ ; Заголовок меню ЗАГРУЗКА 103114$:.ASCII <33><244>/ЗАГРУЗКА/<33><277><244> .BYTE 12,12 .REPT 10 .BYTE 31 .ENDR .ASCII /(0/<221>/3): 0/<12> .REPT 10 .BYTE 32 .ENDR .ASCIZ /(1,2): 1/ ; Надписи меню ЗАГРУЗКА 103175$:.ASCIZ /1 - диск / 103216$:.ASCIZ /2 - кассета ПЗУ / 103237$:.ASCIZ /3 - сеть / 103260$:.ASCIZ /4 - стык С2 / 103301$:.ASCIZ /5 - магнитофон / 103322$:.ASCIZ /6 - отладка / 103343$:.ASCIZ /7 - тестирование/ ; Стирание правой части экрана 103364$:.REPT 10 .BYTE 37,35 .ENDR .BYTE 37,0 ; Краткий хелпинг 103406$:.BYTE 61,221,71,54,200,54,201 .ASCII / - выбор элемента/<15><12> .BYTE 40,40,203 .ASCII / - следующий уровень/<15><12> .BYTE 40,40,202 .ASCII / - предыдущий уровень/<15><12> .ASCIZ /0,/<224>/,ИСП - выход/ .EVEN -------------------- Живы будем - Не помрем !
|
![]() ![]() |
SuperMax |
![]()
Сообщение
#2
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Root Admin Сообщений: 6 342 Регистрация: 7.1.2006 Из: Красноярск Пользователь №: 1 ![]() |
Код ; ****************************************************** ; * * ; * ДРАЙВЕР КАНАЛА 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 -------------------- Живы будем - Не помрем !
|
![]() ![]() |
Текстовая версия | Сейчас: 4.7.2025, 17:35 |