;NOTE: [NZ] Переформатировано под формат субтитров BKBTL из файла 100000z5x.txt ;NOTE: [NZ] Файл 100000z5x.txt создан пользователем a214 форума bk0010.org: http://bk0010.org/forum/?id=3073&page= ;##################### МОНИТОР БК-0010/БК-0010.01 А=100000-120000 ############################# 100000$:JMP MNDMBK ; переход на начало МОНИТОРА ; ----- ТАБЛИЦА ПЕРЕХОДОВ ПО EMT ----- 100004$:.WORD MIDKLW ; EMT 4 - инициализация драйвера клавиатуры КВ 100006$:.WORD MCTKOD ; EMT 6 - чтение кода символа с клавиатуры 100010$:.WORD MCTSTR ; EMT 10 - чтение строки с клавиатуры 100012$:.WORD MUKLC ; EMT 12 - установка ключей клавиатуры 100014$:.WORD MIDMBK ; EMT 14 - инициализация системного ПЗУ 100016$:.WORD MFSIM ; EMT 16 - драйвер ТВ-монитора (формирование символов и переключение режимов) 100020$:.WORD MFSTR ; EMT 20 - вывод строки символов 100022$:.WORD MZSSS ; EMT 22 - вывод символа в служебную строку 100024$:.WORD MUSTKK ; EMT 24 - установка курсора по координатам 100026$:.WORD MSKK ; EMT 26 - считывание координат курсора 100030$:.WORD MFTCK ; EMT 30 - формирование точки по координатам 100032$:.WORD MFWEKT ; EMT 32 - формирование вектора по координатам 100034$:.WORD MCTSSD ; EMT 34 - чтение слова состояния дисплея (ССД) 100036$:.WORD MDMAG ; EMT 36 - Драйвер магнитофона МГ 100040$:.WORD MIDTLG ; EMT 40 - инициализация драйвера ТЛГ-канала 100042$:.WORD MPDBYT ; EMT 42 - передача байта на линию ТЛГ 100044$:.WORD MPRBYT ; EMT 44 - прием байта с линии ТЛГ 100046$:.WORD MPDMAS ; EMT 46 - передача массива на линию ТЛГ 100050$:.WORD MPRMAS ; EMT 50 - прием массива с линии ТЛГ ; ----- РЕЗЕРВНЫЕ EMT ----- 100052$:.WORD 160000 100054$:.WORD 160004 100056$:.WORD 160010 100060$:.WORD 160014 100062$:.WORD 160020 100064$:.WORD 160024 100066$:.WORD 160030 100070$:.WORD 160034 100072$:.WORD 160040 100074$:.WORD 160044 100076$:.WORD 160050 100100$:.WORD 160054 100102$:.WORD 160060 100104$:.WORD 160064 100106$:.WORD 160070 100110$:.WORD 160074 ; ----------------------------------------------------------------------------- ; обработчик EMT 100112$:MOV R5,-(SP) ; сохраняем R5 который будет использован в обработчике EMT 100114$:MOV 2(SP),R5 ; адрес следующей за EMT команды 100120$:MOV -(R5),R5 ; в R5 код команды EMT 100122$:BIC #177400,R5 ; маска для номера EMT для 0-377 (правильнее было бы BIC #177401,R5) 100126$:MOV 100000(R5),R5 ; смещение для таблицы переходов по номеру EMT (+100000) 100132$:CALL (R5) ; переход по таблице EMT (расположена с адреса 100004, исп EMT 4 - EMT 50) 100134$:MOV (SP)+,R5 ; восстановим R5 100136$:RTI ; возврат из прерывания ; EMT-14 инициализация системного ПЗУ 100140$:CLR R1 ; в R1=0 - начало ОЗУ 100142$:MOV #20,R2 ; число слов для цикла SOB (20x2=40 байт) 100146$:MOV #100000,(R1)+ ; команда (R1)+ увеличивает R1 на 2 при каждом обращеннии в цикле 100152$:SOB R2,100146 ; цикл (100146-100152) записи в ячейки 0 - 40 адреса 100000 (R2 уменьшается на 1 в каждом цикле) 100154$:MOV #100442,@#4 ; прерывание по клавише СТОП или зависанию 100162$:MOV #100112,@#30 ; прерывание по команде EMT 100170$:MOV #200,@#32 ; ССП=200 для EMT (во время отработки EMT прерывания только по клавише СТОП) 100176$:MOV #120,R2 ; (120 слов = 240 байт) 100202$:CLR (R1)+ ; R1 увеличивается на 2 (от R1=40) 100204$:SOB R2,100202 ; обнуление области 40 - 300 (R2 уменьшается на 1 в каждом цикле) 100206$:EMT 4 ; инициализация драйвера клавиатуры 100210$:INC 162 ; получим 1 (было 0) константа смещения символов на экране =1 100214$:INCB 155 ; получим 1 (было 0) код положения графического курсора =1 100220$:COM 214 ; получим 177777 (было 0) белый цвет символов на экране 100224$:COM 220 ; получим 177777 (было 0) белый цвет символов в служебной строке 100230$:CALL 104730 ; начальные установки видеоконтроллера и режимов работы с экраном 100234$:CLR R0 ; номер скорости для ТЛГ (это максимум=9600 бод) 100236$:EMT 40 ; инициализация драйвера ТЛГ-канала 100240$:CLR @#177714 ; сброс в исх состояние выходного регистра порта вывода 100244$:MOV #220,@#177716 ; выходы системного регистра перевести в исх состояние (10010000) 100252$:MTPS #0 ; ССП=0 (прерывания разрешены) 100256$:RET ; вход в диалоговый Монитор 100260$:MOV #1000,SP ; указатель стека на адрес 1000 100264$:CALL 100140 ; инициализация драйверов сист ПЗУ (EMT 14 исп нельзя, обработка EMT будет задействована этой подпрограммой) 100270$:CALL @#120000 ; вход в ПЗУ=120000 (Фокал, Бейсик или ПЗУ пользователя) 100274$:CALL 100140 ; повторная инициализация сист ПЗУ (EMT 14 исп нельзя - у Фокала, Бейсика или в программе пользователя может быть свой обработчик EMT, другие адреса векторов и другие сист ячейки) 100300$:MOV #100720,R3 ; адрес начала текста (первый байт-длина=3) 100304$:CALL 100460 ; вывод текста (в R3-адрес начала) (коды ПереводСтроки-ЗНАК ВОПРОСА-ПРОБЕЛ) ? _ 100310$:EMT 6 ; ввод символа с клавиатуры (введенный символ в R0) 100312$:EMT 16 ; введенный символ на экран (эхо) 100314$:MOV R0,R4 ; введенный символ сохраняется в R4 100316$:CALL 100472 ; проверка на ввод восьмеричного числа или кода 12(ВВОД) - если число, то оно в R5 100322$:BIC #240,R4 ; маска для кодов клавиш (для независимости от регистра РУС-ЛАТ) 100326$:CMP R4,#115 ; была нажата буква М(Магнитофон) - ? 100332$:BNE 100342 ; нет 100334$:CALL 100536 ; да загрузка с магнитофона 100340$:BR 100300 100342$:CMP R4,#114 ; была нажата буква Л(Линия) - ? 100346$:BCS 100432 ; (BCS=BLO - меньше) коды меньше 114 не используются 100350$:BNE 100360 ; нет 100352$:CALL 100656 ; да загрузка с линии 100356$:BR 100300 100360$:CMP R4,#123 ; была нажата буква С(Старт) - ? 100364$:BNE 100402 ; нет 100366$:TST R5 ; адрес старта был введен? 100370$:BNE 100376 ; да, старт с введенного адреса; нет - взять адрес старта из загруженного файла 100372$:MOV 264,R5 ; взять адрес для старта из ячейки 264 (сист ячейка-буфер адреса при загрузке с МГ или ТЛГ) 100376$:CALL (R5) ; старт загруженной программы 100400$:BR 100300 100402$:CMP R4,#124 ; была нажата буква Т(Тесты) - ? 100406$:BNE 100416 ; нет 100410$:CALL @#160100 ; да вход в ПЗУ=160100 ТЕСТы 100414$:BR 100300 100416$:CMP R4,#120 ; была нажата буква П(Пользователь) - ? 100422$:BNE 100300 ; нет 100424$:CALL @#140000 ; да вход в ПЗУ=140000 с программой пользователя 100430$:BR 100300 ; ### команды 100432-100440 лишние к ним нет обращений ### 100432$:CMP R4,#100 ; сравнить с кодом 100 - ? (для всех других букв) 100436$:BCC 100260 ; (BCC=BHIS - больше или равно) снова на вход диалогового Монитора с переинициализацией драйверов 100440$:BR 100300 ; прерывание по клавише СТОП или зависанию (вектор 4) 100442$:MOV #1000,SP ; установить стек на 1000 100446$:MOV #220,@#177716 ; сист порт в исх сост 100454$:EMT 4 ; инициализация драйвера клавиатуры 100456$:BR 100300 ; возврат в диалоговый Монитор ; вывод строки символов (адрес начала строки в R3, первый байт-длина) 100460$:MOVB (R3)+,R2 ; количество символов 100462$:MOVB (R3)+,R0 100464$:EMT 16 ; вывод символа из мл байта R0 (текущее положение символьного курсора в R...) 100466$:SOB R2,100462 ; цикл вывода строки (100462-100466) 100470$:RET ; ввод восьмеричного числа с клавиатуры(коды меньше 60 и больше 67 не учитываются, число в R5) 100472$:CLR R5 100474$:EMT 6 100476$:EMT 16 100500$:CMPB R0,#12 100504$:BEQ 100534 100506$:CMPB R0,#67 100512$:BHI 100472 ; коды больше 67 не учитываются 100514$:SUB #60,R0 100520$:BMI 100472 ; коды меньше 60 не учитываются 100522$:ASL R5 ; сдвиг для следующей цифры 100524$:ASL R5 100526$:ASL R5 100530$:ADD R0,R5 100532$:BR 100474 100534$:RET ; загрузка с магнитофона 100536$:MOV #320,R1 ; адрес начала блока параметров в R1 100542$:MOV #3,(R1)+ ; команда (#3 это команда чтения) 100546$:MOV R5,(R1)+ ; адрес загрузки в ОЗУ - если не указан(при R5=0) то берется из оглавления файла 100550$:CLR (R1)+ ; очищаем ячейку для длины файла и в R1 получаем адрес для ввода имени файла 100552$:MOV #100724,R3 ; адрес текста ИМЯ 100556$:CALL 100460 ; вывод строки ИМЯ 100562$:MOV #5020,R2 ; длина строки=20 символ ограничитель=12 100566$:EMT 10 ; чтение строки с клавиатуры (адрес конца строки в R1, недостающее кол-во символов до 20 в R2) 100570$:DEC R1 ; убираем код 12 100572$:MOVB #40,(R1)+ ; заменяем пробелом и дополняем длину до 20 если нужно 100576$:DEC R2 ; уменьшаем R2 и в R2 должен быть 0 (если введено длинное имя в 20 символов) 100600$:BPL 100572 ; нет в R2 не 0 - дополняем пробелами до длины=20 если нужно 100602$:MOV #320,R1 ; адрес блока параметров в R1 100606$:EMT 36 ; драйвер магнитофона 100610$:MOVB 1(R1),R0 ; ответ от драйвера МГ 100614$:BEQ 100654 ; нет ошибок (имя совпало и КС в норме R0=0) - программа находится в ОЗУ 100616$:DEC R0 ; если было R0=1 то не совпало имя и после DEC R0 будет R0=0 с переходом на 100622 100620$:BNE 100644 ; ошибка КС(в R0 была не 1) на вывод слова ОШИБКА и выход 100622$:ADD #32,R1 ; не совпало имя - вывести найденное имя 100626$:MOV #20,R2 ; длина строки=20 100632$:EMT 20 ; вывод строки с именем файла 100634$:MOV #12,R0 ; переход на следующую строку (сделать вход EMT 16x для кода 12) 100640$:EMT 16 100642$:BR 100602 ; продолжить чтение с магнитофона 100644$:MOV #100732,R3 ; адрес текста ОШИБКА 100650$:CALL 100460 ; вывод строки ОШИБКА 100654$:RET ; загрузка с линии (в R5-адрес загрузки, если R5=0 то загрузка по адресу из оглавления файла) 100656$:EMT 44 ; прием байта с линии (если на входе постоянная готовность то строки 100656 и 100660 можно не рассм?) 100660$:EMT 42 ; передача байта на линию (повторение принятого байта) 100662$:MOV #264,R1 ; ячейка для адреса из оглавления файла 100666$:MOV #4,R2 ; 2 байта адрес +2 байта длина 100672$:EMT 50 ; прием 4 байт с линии (адрес и длина массива) 100674$:TST R5 ; адрес загрузки был введен? 100676$:BEQ 100704 ; если нет (R5=0) то адрес загрузки берется из оглавления файла 100700$:MOV R5,264 ; адрес загрузки был введен 100704$:MOV 264,R1 ; адрес в ОЗУ для загрузки файла 100710$:MOV 266,R2 ; длина файла 100714$:EMT 50 ; прием файла (массива) с линии 100716$:RET ;NOTE: [NZ] TODO: Тексты диалогового Монитора 100720-100740 ; EMT 4 - инициализация драйвера клавиатуры 100742$:MOV #101136,@#60 ; вектор 60 (А=101136) 100750$:MOV #200,R0 100754$:MOV R0,@#62 ; ССП=200 100760$:MOV #101362,@#274 ; вектор 274 (А=101362) 100766$:MOV R0,@#276 ; ССП=200 100772$:CLR 260 ; сброс адреса подпрограммы обработки прерываний от клавиатуры (если 0 то нет обработки) 100776$:CLR 262 ; установить для ВК код 12 101002$:CLR @#177660 ; сброс регистра состояния клавиатуры (прерывания от клавиатуры разрешены) 101006$:RET ; EMT 6 - чтение кода символа с клавиатуры (сл ячейки 122(байт) 124 111 110 106 105 104) 101010$:MTPS #0 ; ССП=0 101014$:MOV @#177662,R0 ; прочитать регистр данных клавиатуры 101020$:TSTB 122 ; 101024$:BEQ 101044 101026$:MOVB @124,R0 101032$:INC 124 ; 101036$:DECB 122 ; 101042$:BR 101134 101044$:TSTB 111 ; 101050$:BEQ 101064 101052$:MOV #40,R0 101056$:DECB 111 ; 101062$:BR 101134 101064$:TSTB 110 ; 101070$:BEQ 101114 101072$:MOV 106,R0 ; 101076$:SOB R0,101076 ; задержка 101100$:BIT #100,@#177716 ; проверка нажатия клавиши 101106$:BEQ 101122 ; клавиша не нажата - на выход 101110$:CLRB 110 ; 101114$:TSTB 105 ; 101120$:BEQ 101020 101122$:CLR R0 101124$:BISB 104,R0 ; 101130$:CLRB 105 ; 101134$:RET ; ----------------------------------------------------------------------------- ; прерывание от клавиатуры - вектор 60 (сл ячейки 262 222 43) 101136$:JSR R4,110340 ; сохранить R0-R4 101142$:MOV R5,-(SP) 101144$:CALL 102032 ; обработка кода при нажатии клавиши (звук) 101150$:CMPB R0,#20 101154$:BHI 101304 ; код больше 20 101156$:MOV R0,R1 101160$:SUB #12,R1 101164$:BMI 101264 ; код меньше 12 101166$:ASL R1 ; сделать четным 101170$:ADD R1,PC ; получить адрес перехода по BR (коды между 12 и 20) 101172$:BR 101210 ; код 12 101174$:BR 101316 ; код 13 101176$:BR 101316 ; код 14 101200$:BR 101256 ; код 15 101202$:BR 101224 ; код 16 101204$:BR 101234 ; код 17 101206$:BR 101254 ; код 20 ; - код 12 101210$:TST @#262 ; если 0 то будет код 12 иначе сделать 15 101214$:BEQ 101316 101216$:MOV #15,R0 101222$:BR 101316 ; - код 16 101224$:MOVB #200,43 ; переключить на режим РУС 101232$:BR 101240 ; - код 17 101234$:CLRB 43 ; переключить на режим ЛАТ ; - код 16 и 17 продолжение 101240$:CLR R0 101242$:CLR 222 ; 101246$:CALL 110572 ; для кодов 16 17 101252$:BR 101322 ; управляющие коды не отображаются ; - код 20 101254$:CLR R3 ; - код 15 101256$:CALL 101332 ; 101262$:BR 101322 ; код меньше 12 101264$:TST R0 101266$:BNE 101316 101270$:TSTB @#177660 ; проверка нажатия клавиши 101274$:BPL 101270 ; продолжать проверять (ждать нажатия клавиши) 101276$:CALL 102032 ; обработка кода при нажатии клавиши 101302$:BR 101322 ; выход из подпрограммы прерывания по вектору 60 ; - код 12 101304$:CMPB R0,#77 101310$:BLOS 101316 ; меньше или равно 77 101312$:BISB 43,R0 ; маска для кодов РУС-ЛАТ (если РУС то добавляется бит 200) ; - код 13 и 14 ; - код 12 или замененный на 15 101316$:CALL 102124 ; коды 12-15 и все символы РУС-ЛАТ 101322$:MOV (SP)+,R5 101324$:JSR R4,110362 ; восстановить R0-R4 101330$:RTI ; ----------------------------------------------------------------------------- 101332$:CALL 102160 ; что-то связанное с восьмеричным числом? 101336$:TST R3 101340$:BEQ 101350 101342$:BIS R0,112(R1) 101346$:BR 101354 101350$:BIC R0,112(R1) 101354$:CALL 111130 ; 101360$:RET ; прерывание от клавиатуры - вектор 274 (управляющие коды и коды НижнегоРегистра-псевдографика и др) 101362$:JSR R4,110340 ; сохранить R0-R4 101366$:MOV R5,-(SP) 101370$:CALL 102032 ; обработка кода при нажатии клавиши (звук) 101374$:BISB #200,R0 101400$:CMPB R0,#277 101404$:BLOS 101420 101406$:BICB #100,R0 101412$:BISB #40,R0 101416$:BR 101622 ; коды меньше или равно 277 101420$:CMPB R0,#257 101424$:BLOS 101474 101426$:CMPB R0,#271 101432$:BHI 101474 101434$:TSTB 122 101440$:BNE 101626 101442$:BIC #177760,R0 101446$:ASL R0 101450$:MOV 126(R0),124 101456$:BEQ 101626 101460$:MOVB @124,122 101466$:INC 124 101472$:BR 101626 ; коды меньше или равно 257 101474$:CMPB R0,#237 101500$:BLOS 101540 101502$:BICB #40,R0 101506$:BISB #20,R0 101512$:CMPB R0,#232 101516$:BCS 101622 101520$:CMPB R0,#234 101524$:BEQ 101622 101526$:CMPB R0,#237 101532$:BEQ 101622 101534$:EMT 16 101536$:BR 101626 ; коды меньше или равно 237 101540$:CMPB R0,#211 101544$:BCS 101556 101546$:BNE 101610 101550$:CALL 101636 ; 101554$:BR 101626 ; коды меньше 211 101556$:CMPB R0,#204 101562$:BHI 101602 101564$:CMPB R0,#201 101570$:BHI 101534 101572$:BNE 101602 101574$:INCB 110 101600$:BR 101626 ; коды больше 204 (и меньше 211) 101602$:BIS #20,R0 ; сделать из них коды 224-231 101606$:BR 101622 ; коды больше 211 101610$:CMPB R0,#213 101614$:BNE 101622 101616$:MOV #231,R0 ; код 212 - код 231(который был 213) и код 237 101622$:CALL 102124 ; в R5 адрес перехода на подпрограмму? ######################### ? 101626$:MOV (SP)+,R5 101630$:JSR R4,110362 ; восстановить R0-R4 101634$:RTI 101636$:CALL 102160 ; 101642$:MOVB #1,111 ; 101650$:ASL R0 101652$:BCS 101672 101654$:BIT R0,112(R1) 101660$:BNE 101722 101662$:INCB 111 ; 101666$:ASL R0 101670$:BCC 101654 101672$:ADC R0 101674$:ADD #2,R1 101700$:CMP R1,#4 101704$:BCS 101654 101706$:TSTB 40 ; 101712$:BNE 101722 101714$:CMP R1,#10 101720$:BNE 101654 101722$:RET ; EMT 10 - чтение строки с клавиатуры 101724$:MOV R0,-(SP) 101726$:MOV R2,R5 101730$:SWAB R5 101732$:BIC #177400,R2 101736$:MOV R2,-(SP) ; зачем сохраняется R2 ? 101740$:EMT 6 101742$:CMPB R0,#30 101746$:BNE 101764 101750$:CMP R2,(SP) 101752$:BEQ 101740 101754$:DEC R1 101756$:ADD #2,R2 101762$:BR 101766 101764$:MOVB R0,(R1)+ 101766$:EMT 16 101770$:CMPB R0,R5 101772$:BEQ 101776 101774$:SOB R2,101740 101776$:MOV (SP)+,R0 ; сохранялся R2 почему восстанавливается R0 - просто для восст указателя стека 102000$:MOV (SP)+,R0 102002$:RET ; EMT 12 - установка ключей клавиатуры (R0-номер ключа R1-адрес текста ключа) 102004$:TST R0 102006$:BLE 102030 102010$:CMP R0,#12 102014$:BHI 102030 ; номер ключа не больше 12 102016$:BNE 102022 102020$:CLR R0 102022$:ASL R0 ; сделать четным для прибавления к смещению 102024$:MOV R1,126(R0) ; адреса текстов ключей(1-10) в ячейках 126-140 102030$:RET ; обработка кода при нажатии клавиши - звук БИП (проверяется ячейка 224) 102032$:TST 224 102036$:BEQ 102044 102040$:CALL 110536 ; ? 102044$:MOV #177777,222 102052$:MOV #50,R2 ; длительность звука БИП 102056$:MOV #100,R3 ; частота звука 102062$:MOV #320,@#177716 ; импульс на динамик 102070$:MOV R3,R0 102072$:SOB R0,102072 ; длительность положительной половины импульса 102074$:MOV #220,@#177716 ; сбросить 102102$:MOV R3,R0 102104$:SOB R0,102104 ; пауза (длительность отрицательной половины импульса) 102106$:DEC R3 102110$:SOB R2,102062 ; цикл звука при нажатии клавиши (102062-102110) 102112$:MOV @#177716,R0 ; признак нажатия клавиши в старшем байте R0 102116$:MOVB @#177662,R0 ; код нажатой клавиши в младшем байте R0 102122$:RET ; переход к доп подпрограмме обработки по содержимому @#260 (ссылка из строки 101622) ; исп ячейки 260 105 104 102124$:MOV @#260,R5 ; адрес подпрограммы обработки прерывания от клавиатуры 102130$:BNE 102140 102132$:TSTB 105 102136$:BNE 102156 102140$:MOVB R0,104 102144$:MOVB R0,105 102150$:TST R5 102152$:BEQ 102156 102154$:CALL (R5) ; переход к доп подпрограмме обработки (типа функц клавиш) 102156$:RET ; формирование кода восьмеричной цифры? - нет это связано с графикой (исп ячейки 156 40) - вызов из 101332 102160$:MOV 156,R1 102164$:BIC #177700,R1 ; выделить младший байт 102170$:TSTB 40 ; режим 32/64 символа в строке 102174$:BEQ 102200 ; @#40=0 это режим 64 символа в строке 102176$:ASR R1 ; для режима 32 символа в строке 102200$:MOV R1,R2 102202$:BIC #177760,R2 ; в R2 будет число 0-17 (0-15Д) или 0-7 в зависимости от @#40 102206$:INC R2 102210$:CLR R0 102212$:SEC 102214$:ROL R0 102216$:SOB R2,102214 102220$:BIC #177717,R1 102224$:ASR R1 102226$:ASR R1 102230$:ASR R1 102232$:RET ; EMT 16 - формирование символов и переключение режимов 102234$:JSR R4,110346 ; сохранить R0-R4 102240$:INC 222 ; 102244$:TSTB 50 ; режим ГРАФ ? 102250$:BEQ 102260 ; нет 102252$:CALL 105670 ; работа в режиме ГРАФ 102256$:BR 102362 ; закончена работа в режиме ГРАФ - на выход из EMT 16 102260$:BIC #177400,R0 102264$:CMPB R0,#177 102270$:BHI 102312 102272$:CMPB R0,#37 102276$:BLOS 102326 102300$:SUB #20,R0 102304$:CALL 102370 ; вывод символа 102310$:BR 102362 102312$:CMPB R0,#237 102316$:BLOS 102356 102320$:SUB #60,R0 102324$:BR 102304 102326$:CMPB R0,#21 102332$:BLOS 102342 102334$:CALL 103310 ; 102340$:BR 102362 102342$:CMPB R0,#10 102346$:BEQ 102334 102350$:CALL 104130 ; 102354$:BR 102362 102356$:CALL 104320 ; 102362$:JSR R4,110362 ; восстановить R0-R4 102366$:RET ; вывод символа ; ячейки 162-шаг символов 156-положение текстового курсора 102370$:CALL 102746 ; 102374$:ADD 162,156 ; смещение символа+положение текстового курсора 102402$:CALL 102414 ; 102406$:CALL 103222 ; 102412$:RET ; в таблице нет описания на ячейки 152 и 156 102414$:TSTB 152 ; 102420$:BNE 102432 102422$:BIT #77,156 ; проверить позиции 0-63 102430$:BNE 102556 ; если не 0 (не нулевая позиция в строке) то переход 102432$:CLR R3 102434$:MOV 156,R5 ; положение текстового курсора 102440$:BPL 102454 102442$:INC R3 102444$:ADD #100,R5 102450$:BMI 102444 102452$:BR 102474 102454$:CMP R5,164 102460$:BCS 102500 102462$:SUB #100,R5 102466$:CMP R5,164 ; длина ОЗУ экрана в символах 102472$:BCC 102462 102474$:CALL 102566 ; 102500$:MOV R5,156 ; адрес текстового курсора 102504$:MOV R5,R4 102506$:BIC #177700,R4 102512$:BIC #77,R5 102516$:ASL R5 102520$:ADD R5,R4 102522$:ASL R5 102524$:ASL R5 102526$:ADD R5,R4 102530$:ADD 204,R4 ; адрес начала инф области экрана 102534$:BIC #140000,R4 102540$:ADD 202,R4 ; прибавить начальный адрес ОЗУ экрана 102544$:MOV R4,160 ; абсолютный адрес курсора в ОЗУ 102550$:CLRB 152 ; ? 102554$:BR 102564 ; RET 102556$:ADD 162,160 ; положение курсора + смещение 102564$:RET 102566$:TSTB 42 ; проверка на режим РП 102572$:BNE 102712 ; да РП 102574$:MOV #12,R4 102600$:TST R3 102602$:BEQ 102606 102604$:NEGB R4 102606$:ADD R4,@#177664 ; исп регистр рулонного сдвига 102612$:MOV 204,R1 ; адрес начала области экрана 102616$:MOV #20,R2 102622$:TST R3 102624$:BEQ 102664 102626$:SUB #2000,R1 102632$:BIC #140000,R1 102636$:ADD 202,R1 ; начальный адрес ОЗУ экрана 102642$:CALL 111516 ; 102646$:SUB #1200,204 102654$:BIC #140000,204 102662$:BR 102744 102664$:ADD 202,R1 102670$:CALL 111616 ; 102674$:ADD #1200,204 102702$:BIC #140000,204 102710$:BR 102744 102712$:MOV #36,R2 102716$:TST R3 102720$:BEQ 102734 102722$:MOV #75600,R1 102726$:CALL 111616 ; 102732$:BR 102744 102734$:MOV #73200,R1 102740$:CALL 111516 ; 102744$:RET ; ----------------------------------------------------------------------------- ; ЗАПИСЬ СИМВОЛА ИЗ ЗНАКОГЕНЕРАТОРА В ВИДЕО-ОЗУ 102746$:ASL R0 102750$:MOV R0,R1 102752$:ASL R0 102754$:ASL R0 102756$:ADD R0,R1 102760$:ADD #112036,R1 ; адрес начала символов (смещение) = 112036 102764$:MOV 160,R3 ; абсолютный адрес курсора в ОЗУ 102770$:MOV #11,R2 102774$:TSTB 40 ; проверить режим 32-64 103000$:BNE 103066 ; переход для режима 32 символа в строке 103002$:CLR R0 103004$:TSTB 45 ; есть инверсия ? 103010$:BEQ 103014 103012$:COM R0 103014$:TST 212 ; код цвета фона на экране ? 103020$:BEQ 103024 103022$:COM R0 103024$:MOVB (R1)+,(R3) 103026$:TST R0 103030$:BEQ 103034 103032$:COMB (R3) 103034$:CALL 111434 ; ЗАПИСЬ В ОЗУ 103040$:SOB R2,103024 ; цикл (103024-103040) запись в ОЗУ растрового символа в матрице 8х10Д 103042$:MOVB (R1)+,(R3) 103044$:TST R0 103046$:BEQ 103052 103050$:COMB (R3) 103052$:TSTB 44 ; подчеркивание есть? 103056$:BEQ 103220 ; нет 103060$:MOVB 214,(R3) ; код цвета символа на экране 103064$:BR 103220 ; на RET (вместо BR) ; вывод в режиме 103066$:CLR -(SP) 103070$:MOVB (R1)+,R5 103072$:BIC #177400,R5 103076$:MOV #20,R4 103102$:CLR R0 103104$:TSTB 45 ; инверсия есть ? 103110$:BEQ 103114 ; нет 103112$:COMB R5 103114$:TSTB R5 103116$:BEQ 103144 103120$:ASR R5 103122$:BCC 103132 103124$:BEQ 103140 103126$:BIS 112004(R4),R0 103132$:SUB #2,R4 103136$:BNE 103120 103140$:BIS 112004(R4),R0 103144$:MOV 212,R5 ; цвет фона 103150$:BIC R0,R5 103152$:MOV 214,R4 ; цвет символа 103156$:COM R0 103160$:BIC R0,R4 103162$:BIS R5,R4 103164$:MOV R4,(R3) ; запись одной строки из матрицы символа в ОЗУ экрана 103166$:CALL 111434 ; подготовка адреса следующей строки 103172$:SOB R2,103070 ; цикл вывода (103070-103172) запись в ОЗУ растрового символа в матрице 8х10Д 103174$:TST (SP) 103176$:BNE 103216 103200$:INC (SP) 103202$:INC R2 103204$:TSTB 44 ; подчеркивание есть? 103210$:BEQ 103070 ; нет 103212$:MOV 214,(R3) ; код цвета символа на экране 103216$:MOV (SP)+,R0 103220$:RET ; ----------------------------------------------------------------------------- ; вывод курсора 103222$:TSTB 56 ; гашение курсора есть ? 103226$:BNE 103306 ; гашение курсора установлено - переход на RET 103230$:MOV 160,R3 ; абсолютный адрес курсора в ОЗУ 103234$:MOV #12,R2 ; десятая строка (12) это курсор (аналогично символу подчеркивания) 103240$:TSTB 40 ; 103244$:BNE 103264 ; для режима 32 символа 103246$:MOV #377,R5 103252$:ASR R3 103254$:BCC 103260 103256$:SWAB R5 103260$:ASL R3 103262$:BR 103276 ; вход для вывода курсора в режиме 32 103264$:MOV 214,R5 ; 103270$:MOV 212,R4 ; 103274$:XOR R4,R5 103276$:XOR R5,(R3) ; вывод курсора (в R3 абсолютный адрес курсора в ОЗУ) 103300$:CALL 111434 ; подготовка адреса следующей строки 103304$:SOB R2,103276 103306$:RET 103310$:TSTB 47 ; блокировка редактирования ? 103314$:BEQ 103324 ; разрешено редактирование 103316$:CALL 104244 ; 103322$:BR 103542 ; это RET (BR не нужен) ; разрешено редактирование 103324$:MOV 156,R1 103330$:MOV 162,R2 103334$:MOV #100,R3 103340$:CMPB R0,#10 103344$:BNE 103352 ; если R0 не равно 10 то переход к обработке 103346$:SUB R2,R1 103350$:BR 103532 103352$:SUB #22,R0 103356$:ASL R0 ; сделать четным 103360$:ADD R0,PC ; получить адрес перехода по BR 103362$:BR 103416 ; код 22 103364$:BR 103422 ; код 23 103366$:BR 103430 ; код 24 103370$:BR 103436 ; код 25 103372$:BR 103446 ; код 26 103374$:BR 103454 ; код 27 103376$:BR 103462 ; код 30 103400$:BR 103470 ; код 31 103402$:BR 103474 ; код 32 103404$:BR 103500 ; код 33 103406$:BR 103504 ; код 34 103410$:BR 103512 ; код 35 103412$:BR 103520 ; код 36 103414$:BR 103526 ; код 37 ; код 22 103416$:CLR R1 103420$:BR 103532 ; код 23 103422$:CALL 103760 ; 103426$:BR 103542 ; код 24 103430$:CALL 104020 ; 103434$:BR 103542 ; код 25 103436$:ADD R3,R1 103440$:BIC #77,R1 103444$:BR 103532 ; код 26 103446$:CALL 103600 ; 103452$:BR 103542 ; код 27 103454$:CALL 103700 ; 103460$:BR 103542 ; код 30 103462$:CALL 103544 ; 103466$:BR 103542 ; код 31 103470$:ADD R2,R1 103472$:BR 103532 ; код 32 103474$:SUB R3,R1 103476$:BR 103532 ; код 33 103500$:ADD R3,R1 103502$:BR 103532 ; код 34 103504$:SUB R3,R1 103506$:SUB R2,R1 103510$:BR 103532 ; код 35 103512$:SUB R3,R1 103514$:ADD R2,R1 103516$:BR 103532 ; код 36 103520$:ADD R3,R1 103522$:ADD R2,R1 103524$:BR 103532 ; код 37 103526$:ADD R3,R1 103530$:SUB R2,R1 103532$:MOV R1,156 103536$:CALL 111352 ; 103542$:RET ; продолжение для код 30 103544$:CALL 103222 ; 103550$:SUB 162,156 103556$:INCB 152 103562$:CALL 102414 ; 103566$:CALL 111374 ; 103572$:CALL 103222 ; 103576$:RET 103600$:MOV 160,R3 103604$:MOV R3,R4 103606$:BIS #76,R4 103612$:BIS 162,R4 103616$:MOV #12,R2 103622$:MOV R3,R1 103624$:MOV R1,R5 103626$:ADD 162,R5 103632$:BIT #77,R5 103636$:BEQ 103644 103640$:MOVB (R5)+,(R1)+ 103642$:BR 103632 103644$:CALL 111434 ; 103650$:SOB R2,103622 103652$:MOV 160,-(SP) 103656$:MOV R4,160 103662$:CALL 111374 ; 103666$:MOV (SP)+,160 103672$:CALL 103222 ; 103676$:RET 103700$:CALL 103222 ; 103704$:MOV 160,R3 103710$:MOV #12,R2 103714$:MOV R3,R5 103716$:BIS #77,R5 103722$:INC R5 103724$:MOV R5,R1 103726$:SUB 162,R1 103732$:MOVB -(R1),-(R5) 103734$:CMP R5,R3 103736$:BNE 103732 103740$:CALL 111434 ; 103744$:SOB R2,103714 103746$:CALL 111374 ; 103752$:CALL 103222 ; 103756$:RET 103760$:MOV 160,R1 103764$:BIC #77,R1 103770$:ADD #1200,R1 103774$:BPL 104002 103776$:SUB 206,R1 104002$:CALL 104066 ; 104006$:CALL 111516 ; 104012$:CALL 103222 ; 104016$:RET 104020$:CALL 103222 ; 104024$:MOV 204,R1 104030$:ADD 210,R1 104034$:SUB #1200,R1 104040$:BIC #140000,R1 104044$:ADD 202,R1 104050$:CALL 104066 ; 104054$:CALL 111616 ; 104060$:CALL 103222 ; 104064$:RET 104066$:MOV 164,R3 104072$:MOV 156,R2 104076$:BIS #77,R2 104102$:INC R2 104104$:SUB R2,R3 104106$:MOV #5,R2 104112$:ASR R3 104114$:SOB R2,104112 104116$:MOV R3,R2 104120$:ASL R3 104122$:ASL R3 104124$:ADD R3,R2 104126$:RET 104130$:CMPB R0,#12 104134$:BNE 104200 104136$:CALL 104236 104142$:BIT #77,156 104150$:BNE 104160 104152$:TSTB 46 104156$:BNE 104316 104160$:BIS #77,156 104166$:INC 156 104172$:CALL 111352 ; 104176$:BR 104316 104200$:TSTB 47 104204$:BNE 104236 104206$:CMPB R0,#14 104212$:BNE 104222 104214$:CALL 110376 ; 104220$:BR 104316 104222$:CMPB R0,#7 104226$:BNE 104236 104230$:CALL 102052 ; 104234$:BR 104316 104236$:TSTB 46 ; индикация символов управления включена? 104242$:BEQ 104316 ; нет индикации символов управления - на RET 104244$:SUB #20,R0 104250$:BMI 104260 104252$:CALL 102370 ; 104256$:BR 104316 ; переход на RET 104260$:CMPB R0,#177770 104264$:BNE 104274 104266$:MOV #1,R0 104272$:BR 104252 104274$:ADD #100,R0 104300$:COMB 45 ; 104304$:CALL 102370 ; 104310$:COMB 45 104314$:BR 104316 104316$:RET 104320$:CMPB R0,#202 104324$:BNE 104340 104326$:COMB 46 104332$:MOV #3,R0 104336$:BR 104356 104340$:CMPB R0,#204 104344$:BNE 104360 104346$:COMB 47 104352$:MOV #4,R0 104356$:BR 104706 104360$:CMPB R0,#214 104364$:BNE 104374 104366$:CALL 104722 ; 104372$:BR 104720 104374$:MOVB 50,R5 104400$:BNE 104410 104402$:TSTB 47 104406$:BNE 104714 104410$:SUB #221,R0 104414$:BMI 104720 ; если R0 меньше 221 то переход 104416$:ASL R0 ; сделать четным 104420$:ADD R0,PC ; получить адрес перехода по BR 104422$:BR 104460 ; код 221 104424$:BR 104460 ; код 222 104426$:BR 104460 ; код 223 104430$:BR 104460 ; код 224 104432$:BR 104514 ; код 225 104434$:BR 104526 ; код 226 104436$:BR 104544 ; код 227 104440$:BR 104720 ; код 230 104442$:BR 104562 ; код 231 104444$:BR 104574 ; код 232 104446$:BR 104612 ; код 233 104450$:BR 104620 ; код 234 104452$:BR 104632 ; код 235 104454$:BR 104640 ; код 236 104456$:BR 104676 ; код 237 ; - код 221 222 223 224 104460$:TSTB 40 104464$:BEQ 104720 104466$:MOV 112026(R0),R0 ; смещение в знакогенераторе для кодов 221 222 223 224 104472$:CLRB 41 104476$:CALL 111314 ; вывод спецсимволов по начальному адресу из знакогенератора 104502$:MOV R0,214 ; слово по адресу 112026-112034 занести в ячейку 214 (режим вывода упр символов) 104506$:CALL 111314 ; 104512$:BR 104720 ; - код 225 104514$:CALL 105074 ; 104520$:MOV #5,R0 104524$:BR 104706 ; - код 226 104526$:TST R5 104530$:BEQ 104720 104532$:CLRB 52 104536$:COMB 51 104542$:BR 104520 ; - код 227 104544$:TST R5 104546$:BEQ 104720 104550$:CLRB 51 104554$:COMB 52 104560$:BR 104520 ; - код 231 104562$:TST R5 104564$:BNE 104720 104566$:CALL 105232 ; 104572$:BR 104720 ; - код 232 104574$:CALL 111314 ; 104600$:COMB 56 104604$:CALL 111314 ; 104610$:BR 104720 ; - код 233 104612$:CALL 105272 ; 104616$:BR 104720 ; - код 234 104620$:COMB 45 104624$:MOV #2,R0 104630$:BR 104706 ; - код 235 104632$:CALL 105500 ; 104636$:BR 104720 ; - код 236 104640$:MOV 212,216 104646$:MOV 214,220 104654$:MOV 44,54 104662$:MOVB 40,53 104670$:CALL 110470 ; 104674$:BR 104720 ; - код 237 104676$:COMB 44 104702$:MOV #1,R0 104706$:CALL 110572 ; 104712$:BR 104720 104714$:CALL 105564 ; ; - код 230 104720$:RET ; режим без РП - полный экран 104722$:COMB 42 104726$:BNE 104770 ; вход при инициализации сист ПЗУ 104730$:MOV #40000,202 ; конец экранного ОЗУ (100000-40000) 104736$:MOV #40000,206 ; размер экранного ОЗУ 104744$:MOV #36000,210 104752$:MOV #3000,164 104760$:MOV #1330,@#177664 ; установить режим полного экрана 104766$:BR 105054 ; режим РП 104770$:MOV #70000,202 ; конец экранного ОЗУ (100000-70000) 104776$:MOV #10000,206 ; размер экранного ОЗУ 105004$:MOV #5000,210 105012$:MOV #400,164 105020$:MOV #230,@#177664 ; 105026$:MOV #77000,R3 105032$:MOV #340,R4 105036$:MOV 216,(R3)+ 105042$:SOB R4,105036 ; цикл очистки (105036-105042) 105044$:MOV 220,R1 105050$:CALL 111474 ; 105054$:MOV #2000,204 105062$:CALL 110376 ; 105066$:CALL 110470 ; 105072$:RET 105074$:CALL 111314 ; 105100$:COMB 50 105104$:BEQ 105160 105106$:MOVB 155,154 105114$:CLR 172 105120$:CLR 174 105124$:MOV 160,R0 105130$:MOV R0,170 105134$:SUB 202,R0 105140$:SUB 204,R0 105144$:BPL 105152 105146$:ADD 206,R0 105152$:MOV R0,166 105156$:BR 105214 105160$:CLRB 51 105164$:CLRB 52 105170$:TSTB 40 105174$:BEQ 105204 105176$:BIC #1,156 105204$:INCB 152 105210$:CALL 102414 ; 105214$:MOV #5,R0 105220$:CALL 110572 ; 105224$:CALL 111314 ; 105230$:RET 105232$:MOV 160,-(SP) 105236$:CALL 111374 ; 105242$:ADD 162,160 105250$:BIT #77,160 105256$:BNE 105236 105260$:MOV (SP)+,160 105264$:CALL 103222 ; 105270$:RET 105272$:CALL 111314 ; 105276$:COMB 40 105302$:BNE 105356 105304$:DEC 162 105310$:MOVB #1,155 105316$:BICB #252,154 105324$:CLR 212 105330$:MOV #177777,214 105336$:TSTB 41 105342$:BEQ 105466 105344$:COM 212 105350$:COM 214 105354$:BR 105466 105356$:INC 162 105362$:INC 156 105366$:BIC #1,156 105374$:INCB 152 105400$:CALL 102414 ; 105404$:MOVB #3,155 105412$:BITB #252,154 105420$:BEQ 105454 105422$:ASLB 154 105426$:BCC 105454 105430$:ADCB 154 105434$:INC 166 105440$:CMP 166,210 105446$:BCS 105454 105450$:CLR 166 105454$:MOVB 154,R0 105460$:ASLB R0 105462$:BISB R0,154 105466$:CALL 111130 ; 105472$:CALL 111314 ; 105476$:RET ; ----------------------------------------------------------------------------- ; обработка кода 235 - инверсия экрана 105500$:COMB 41 ; вкл-выкл инверсию экрана 105504$:MOV 214,R0 ; старый код цвета символа в R0 105510$:MOV 212,214 ; сделать код цвета символа равным прежнему цвету экрана 105516$:MOV R0,212 ; новый цвет экрана (=старому коду цвета символа) 105522$:MOV 214,R5 ; 105526$:XOR R5,R0 ; установить R0 для инверсии цвета символов в ОЗУ 105530$:MOV 204,R1 ; адрес начала инф области экрана минус 40000 105534$:ADD 202,R1 ; прибавить начальный адрес ОЗУ экрана 105540$:MOV 210,R2 ; длина инф части экрана в байтах 105544$:ASR R2 ; длина инф части экрана в словах для цикла SOB ; 105546$:XOR R0,(R1)+ ; установка инверсных цветов в ОЗУ экрана - символы и фон (команда ИсключающееИЛИ с ОЗУ экрана) 105550$:TST R1 105552$:BPL 105560 105554$:SUB 206,R1 ; вычесть длину экрана в байтах 105560$:SOB R2,105546 ; (цикл 105546-105560) 105562$:RET ; ----------------------------------------------------------------------------- ; вывод на экран управляющих кодов в виде инверсных букв 105564$:CMPB R0,#225 ; код ГРАФ 105570$:BNE 105600 105572$:MOV #267,R0 ; символ псевдографики? инв 105576$:BR 105634 105600$:CMPB R0,#226 ; код ЗАП 105604$:BNE 105614 105606$:MOV #312,R0 ; буква й? инв J 105612$:BR 105634 105614$:CMPB R0,#227 ; код СТИР 105620$:BNE 105630 105622$:MOV #303,R0 ; буква ц? инв C 105626$:BR 105634 105630$:ADD #20,R0 ; сделать коды отображаемыми в виде инверсных букв 105634$:COMB 45 ; вкл инверсию символов (для служ строки) 105640$:CALL 102746 ; вывод инв символа в служ строку 105644$:COMB 45 ; восстановить режим инв-без инв 105650$:ADD 162,156 105656$:CALL 102414 ; 105662$:CALL 103222 ; 105666$:RET ; работа в режиме ГРАФ 105670$:CMPB R0,#37 105674$:BHI 105704 ; код больше 37 105676$:CALL 105744 ; обработка кодов меньших или равных 37 105702$:BR 105736 105704$:BIC #177400,R0 ; выделить мл байт 105710$:CMPB R0,#71 105714$:BHI 105724 ; коды больше 71 105716$:CALL 107012 ; обработка кодов 40-71 105722$:BR 105742 105724$:CMPB R0,#237 105730$:BHI 105736 ; коды больше 237 105732$:CALL 104320 ; обработка кодов 72-237 105736$:CLR 172 ; ? 105742$:RET ; обработка кодов 31-37 (для режима ГРАФ ?) 105744$:CALL 106564 ; 105750$:CLR R1 105752$:CLR R2 105754$:MOV #100,R4 105760$:MOVB R0,R3 105762$:SUB #31,R3 105766$:BMI 106056 105770$:ASL R3 105772$:ADD R3,PC 105774$:BR 106012 ; код 31 105776$:BR 106016 ; код 32 106000$:BR 106022 ; код 33 106002$:BR 106026 ; код 34 106004$:BR 106034 ; код 35 106006$:BR 106042 ; код 36 106010$:BR 106050 ; код 37 ; - код 31 106012$:INC R1 106014$:BR 106122 ; - код 32 106016$:SUB R4,R2 106020$:BR 106122 ; - код 33 106022$:ADD R4,R2 106024$:BR 106122 ; - код 34 106026$:SUB R4,R2 106030$:DEC R1 106032$:BR 106122 ; - код 35 106034$:SUB R4,R2 106036$:INC R1 106040$:BR 106122 ; - код 36 106042$:ADD R4,R2 106044$:INC R1 106046$:BR 106122 ; - код 37 106050$:ADD R4,R2 106052$:DEC R1 106054$:BR 106122 ; 106056$:CMPB R0,#10 106062$:BNE 106070 106064$:DEC R1 106066$:BR 106122 ; 106070$:CMPB R0,#22 106074$:BNE 106106 106076$:CLR 156 106102$:JMP 110442 ; 106106$:CMPB R0,#14 106112$:BNE 106226 106114$:CALL 110376 ; 106120$:RET ; 106122$:MOV 172,R4 ; 106126$:BNE 106140 106130$:CLRB R0 106132$:SWAB R0 106134$:INC R0 106136$:MOV R0,R4 106140$:TSTB 51 ; ЗАП в режиме ГРАФ включено ? 106144$:BEQ 106154 ; нет 106146$:MOV 214,R0 ; код цвета символа 106152$:BR 106166 106154$:TSTB 52 ; СТИР в режиме ГРАФ включено ? 106160$:BEQ 106220 ; нет 106162$:MOV 212,R0 ; код цвета символа 106166$:MOVB 154,R5 ; унитарный код положения граф курсора 106172$:BICB R5,@170 ; 106176$:MOV R0,R3 106200$:COM R5 ; 106202$:BIC R5,R3 106204$:BISB R3,@170 ; 106210$:CALL 106234 ; 106214$:SOB R4,106166 106216$:BR 106226 106220$:CALL 106234 ; 106224$:SOB R4,106220 106226$:CALL 106564 ; для кодов меньше или равно 37 106232$:RET ; 106234$:MOV 166,R5 ; 106240$:ADD R2,R5 106242$:ADD R2,174 ; 106246$:MOV 154,-(SP) ; сохранить унитарный код граф курсора 106252$:MOV #100,R3 106256$:TST R1 106260$:BEQ 106404 106262$:BMI 106330 106264$:ASLB (SP) 106266$:BCC 106314 106270$:ADCB (SP) 106272$:INC R5 106274$:INC 156 ; 106300$:BIT #77,R5 106304$:BNE 106314 106306$:SUB R3,R5 106310$:SUB R3,156 106314$:TSTB 40 106320$:BEQ 106404 106322$:ASLB (SP) 106324$:ADCB (SP) 106326$:BR 106404 106330$:CLC 106332$:RORB (SP) 106334$:BCC 106364 106336$:BISB #200,(SP) 106342$:BIT #77,R5 106346$:BNE 106356 106350$:ADD R3,R5 106352$:ADD R3,156 ; 106356$:DEC 156 ; уменьшить на 1 код положения текстового курсора 106362$:DEC R5 106364$:TSTB 40 ; режим 32 ? 106370$:BEQ 106404 ; для режима 64 106372$:CLC 106374$:RORB (SP) 106376$:BCC 106404 106400$:BISB #200,(SP) 106404$:MOV (SP)+,154 ; восстановить унитарный код граф курсора 106410$:MOV #1200,-(SP) 106414$:TST 174 ; 106420$:BPL 106430 106422$:NEG R3 106424$:NEG (SP) 106426$:BR 106436 106430$:CMP 174,(SP) ; 106434$:BCS 106506 106436$:SUB (SP),174 ; 106442$:ADD R3,156 ; 106446$:BMI 106460 106450$:CMP 156,164 ; сравнить положение текстового курсора с длиной экрана в символах 106456$:BCS 106506 106460$:SUB (SP),R5 106462$:MOV R5,-(SP) 106464$:JSR R4,110346 ; сохранить R0-R4 106470$:INCB 152 ; 106474$:CALL 102414 ; 106500$:JSR R4,110362 ; восстановить R0-R4 106504$:MOV (SP)+,R5 106506$:MOV (SP)+,R3 106510$:TST R5 106512$:BPL 106522 106514$:ADD 210,R5 ; прибавить длину инф части экрана 106520$:BR 106536 106522$:CMP R5,210 ; сравнить с длиной инф части экрана 106526$:BCS 106536 106530$:SUB 210,R5 ; вычесть длину инф части экрана 106534$:BR 106522 106536$:MOV R5,166 ; 106542$:ADD 204,R5 ; добавить адрес начала инф части экрана 106546$:BIC #140000,R5 106552$:ADD 202,R5 ; добавить адрес начала ОЗУ экрана 106556$:MOV R5,170 ; 106562$:RET ; коды меньше или равно 37 106564$:TSTB 56 ; гашение курсора 106570$:BNE 106770 ; включено гашение курсора 106572$:MOV 214,R4 ; код цвета символа 106576$:MOV 212,R5 ; код цвета фона 106602$:XOR R5,R4 106604$:CLR R5 106606$:BISB 154,R5 ; 106612$:COM R5 106614$:BIC R5,R4 106616$:MOV 170,R3 106622$:ASR R3 106624$:BCC 106630 106626$:SWAB R4 106630$:ASL R3 106632$:MOV R3,R1 106634$:SUB #300,R3 106640$:CMP R3,202 106644$:BHI 106652 106646$:ADD 206,R3 106652$:MOV #7,R2 106656$:XOR R4,(R3) 106660$:CALL 111434 ; 106664$:SOB R2,106656 106666$:MOV #3,R2 106672$:CLC 106674$:MOVB 40,R5 106700$:BEQ 106704 106702$:ASL R2 106704$:ROR R4 106706$:BCC 106714 106710$:DEC R1 106712$:ROR R4 106714$:SOB R2,106704 106716$:BIC #1,R1 106722$:CMP R1,202 106726$:BHI 106734 106730$:ADD 206,R1 106734$:MOV #7,R2 106740$:XOR R4,(R1) 106742$:ROL R4 106744$:BCC 106752 106746$:CALL 106772 ; 106752$:MOV R5,R5 106754$:BEQ 106766 106756$:ROL R4 106760$:BCC 106766 106762$:CALL 106772 ; 106766$:SOB R2,106740 106770$:RET 106772$:ADD #2,R1 106776$:BPL 107004 107000$:SUB 206,R1 107004$:SEC 107006$:ROL R4 107010$:RET 107012$:SUB #60,R0 107016$:BPL 107024 107020$:CLR R0 107022$:BR 107042 107024$:MOV 172,R1 107030$:ASL R1 107032$:ADD R1,R0 107034$:ASL R1 107036$:ASL R1 107040$:ADD R1,R0 107042$:MOV R0,172 107046$:RET ; EMT 20 - вывод строки символов (R1-адрес строки R2-длина мл байт -символ огр ст байт) 107050$:MOV R0,-(SP) 107052$:MOV R3,-(SP) 107054$:MOV R2,R3 107056$:SWAB R3 107060$:BIC #177400,R2 107064$:MOVB (R1)+,R0 107066$:CALL 102234 ; вывод символа (то же что EMT 16) 107072$:CMPB R0,R3 ; сравнить с символом-ограничителем 107074$:BEQ 107100 ; если да то выход 107076$:SOB R2,107064 ; цикл вывода строки(107064-107076) 107100$:MOV (SP)+,R3 107102$:MOV (SP)+,R0 107104$:RET ; EMT 22 - запись символа в служебную строку (R1-номер позиции в сл строке R0-код символа если=0 то сброс строки) 107106$:JSR R4,110346 ; сохранить R0-R4 107112$:TST R0 107114$:BNE 107124 107116$:CALL 110470 ; очистка сл строки если R0=0 107122$:BR 107172 107124$:CMPB R0,#177 107130$:BHI 107154 107132$:CMPB R0,#10 107136$:BNE 107144 107140$:MOV #21,R0 107144$:SUB #20,R0 107150$:BMI 107172 107152$:BR 107166 107154$:CMPB R0,#237 107160$:BLOS 107172 107162$:SUB #60,R0 107166$:CALL 107200 ; ВЫВОД ИЗ ЗНАКОГЕНЕРАТОРА 107172$:JSR R4,110362 ; восстановить R0-R4 107176$:RET ; ----------------------------------------------------------------------------- ; вывод (формирование) в экранном ОЗУ символа из знакогенератора 107200$:MOV R1,-(SP) 107202$:MOV R2,-(SP) 107204$:TSTB 40 ; 32 символа в строке? (если @#40 не равно 0) 107210$:BEQ 107214 ; режим 64 символа в строке 107212$:ASL R1 ; символы будут двойной ширины при 32символах в строке 107214$:BIC #177700,R1 107220$:ADD 204,R1 ; прибавить адрес начала инф области экрана 107224$:SUB #1700,R1 107230$:BIC #140000,R1 107234$:ADD 202,R1 ; прибавить начальный адрес ОЗУ экрана 107240$:MOV 160,-(SP) ; сохранить адрес курсора в ОЗУ 107244$:MOV R1,160 ; 107250$:BIC #177400,R0 ; код для вывода символа не более 377 (мл байт R0) 107254$:CALL 102746 ; ВЫВОД СИМВОЛА 107260$:MOV (SP)+,160 ; восстановить адрес курсора в ОЗУ 107264$:MOV (SP)+,R2 107266$:MOV (SP)+,R1 107270$:RET ; ----------------------------------------------------------------------------- ; EMT 24 - установка курсора по координатам (R1-координата X R2-координата Y) 107272$:JSR R4,110346 ; сохранить R0-R4 107276$:CALL 111314 107302$:MOV 2(SP),R1 107306$:MOV 4(SP),R2 107312$:TSTB 40 107316$:BEQ 107322 107320$:ASL R1 107322$:MOV #6,R0 107326$:ASL R2 107330$:SOB R0,107326 107332$:TSTB 50 107336$:BNE 107400 107340$:BIC #177700,R1 107344$:SUB 164,R2 107350$:BPL 107344 107352$:ADD 164,R2 107356$:BMI 107352 107360$:ADD R1,R2 107362$:MOV R2,156 107366$:INCB 152 107372$:CALL 102414 ; 107376$:BR 107470 107400$:BIC #177000,R1 107404$:MOV R1,R3 107406$:ASR R1 107410$:ASR R1 107412$:ASR R1 107414$:MOVB 155,R0 107420$:BIC #177770,R3 107424$:BEQ 107432 107426$:ASL R0 107430$:SOB R3,107426 107432$:MOVB R0,154 107436$:SUB 210,R2 107442$:BPL 107436 107444$:ADD 210,R2 107450$:BMI 107444 107452$:ADD R1,R2 107454$:MOV R2,166 107460$:CLR R1 107462$:CLR R2 107464$:CALL 106234 ; 107470$:CALL 111314 ; 107474$:JSR R4,110362 ; восстановить R0-R4 107500$:RET ; EMT 26 - чтение координат курсора (R1-координата X R2-координата Y) 107502$:MOV R0,-(SP) 107504$:TSTB 50 107510$:BNE 107526 107512$:MOV 156,R1 107516$:MOV R1,R2 107520$:BIC #177700,R1 107524$:BR 107562 107526$:MOV 166,R1 107532$:MOV R1,R2 107534$:BIC #177700,R1 107540$:ASL R1 107542$:ASL R1 107544$:ASL R1 107546$:MOVB 154,R0 107552$:ASR R0 107554$:BCS 107562 107556$:INC R1 107560$:BR 107552 107562$:TSTB 40 107566$:BEQ 107572 107570$:ASR R1 107572$:BIC #77,R2 107576$:MOV #6,R0 107602$:ASR R2 107604$:SOB R0,107602 107606$:MOV (SP)+,R0 107610$:RET ; EMT 30 - формирование точки по координатам (R0=0-стирание R0=1-запись R1-коордX R2-коордY) 107612$:MOV R1,176 107616$:MOV R2,200 107622$:MOVB R0,153 107626$:JSR R4,110346 ; сохранить R0-R4 107632$:TSTB 40 107636$:BEQ 107644 107640$:ASL R1 107642$:BCS 107770 107644$:CMP R1,#1000 107650$:BCC 107770 107652$:MOV #6,R0 107656$:ASL R2 107660$:BCS 107770 107662$:SOB R0,107656 107664$:CMP R2,210 107670$:BCC 107770 107672$:MOV R1,R3 107674$:ASR R1 107676$:ASR R1 107700$:ASR R1 107702$:ADD R2,R1 107704$:ADD 204,R1 107710$:BIC #140000,R1 107714$:ADD 202,R1 107720$:MOVB 155,R2 107724$:BIC #177770,R3 107730$:BEQ 107736 107732$:ASL R2 107734$:SOB R3,107732 107736$:MOVB (R1),R0 107740$:BICB R2,R0 107742$:MOV 214,R3 107746$:TSTB 153 107752$:BNE 107760 107754$:MOV 212,R3 107760$:COM R2 107762$:BIC R2,R3 107764$:BISB R3,R0 107766$:MOVB R0,(R1) 107770$:JSR R4,110362 ; восстановить R0-R4 107774$:RET ; EMT 32 - формирование вектора по координатам (R0=0-стирание R0=1-запись R1-коордX конца вектора R2-коордY) 107776$:JSR R4,110346 ; сохранить R0-R4 110002$:MOVB R0,153 110006$:MOV R1,R3 110010$:MOV R2,R4 110012$:MOV 176,R1 110016$:MOV 200,R2 110022$:MOV R3,176 110026$:MOV R4,200 110032$:CLR R0 110034$:SUB R1,R3 110036$:BMI 110046 110040$:BEQ 110052 110042$:INC R0 110044$:BR 110052 110046$:DEC R0 110050$:NEG R3 110052$:CLR R5 110054$:SUB R2,R4 110056$:BMI 110066 110060$:BEQ 110072 110062$:INC R5 110064$:BR 110072 110066$:DEC R5 110070$:NEG R4 110072$:CMP R4,R3 110074$:BHI 110114 110076$:MOV R5,-(SP) 110100$:CLR -(SP) 110102$:MOV R3,R5 110104$:MOV R4,R3 110106$:MOV R5,R4 110110$:CLR R5 110112$:BR 110122 110114$:CLR -(SP) 110116$:MOV R0,-(SP) 110120$:CLR R0 110122$:CLR -(SP) 110124$:TST R3 110126$:BNE 110140 110130$:INC R3 110132$:SUB #12,SP 110136$:BR 110250 110140$:SUB R3,R4 110142$:BMI 110150 110144$:INC (SP) 110146$:BR 110140 110150$:ADD R3,R4 110152$:MOV R3,-(SP) 110154$:MOV R3,-(SP) 110156$:ASR (SP) 110160$:MOV R4,-(SP) 110162$:CLR -(SP) 110164$:CLR -(SP) 110166$:CLR R4 110170$:ADD 4(SP),2(SP) 110176$:BEQ 110220 110200$:CMP 2(SP),6(SP) 110206$:BLE 110220 110210$:INC R4 110212$:SUB 10(SP),2(SP) 110220$:ADD 12(SP),R4 110224$:MOV R4,(SP) 110226$:ASR R4 110230$:SUB R4,(SP) 110232$:CALL 110270 ; 110236$:ADD 14(SP),R1 110242$:ADD 16(SP),R2 110246$:MOV (SP),R4 110250$:CALL 110270 ; 110254$:SOB R3,110170 110256$:ADD #20,SP ; глубина стека при работе была 20 110262$:JSR R4,110362 ; восстановить R0-R4 110266$:RET 110270$:TST R4 110272$:BEQ 110306 110274$:ADD R0,R1 110276$:ADD R5,R2 110300$:CALL 107626 ; 110304$:SOB R4,110274 110306$:RET ; EMT 34 - чтение ССД в R0 (ячейки-байты от 40 до 57 - содержат 0 или не 0 - число 377, в ССД соотв записывается 0 или 1) 110310$:MOV R1,-(SP) 110312$:CLR R0 110314$:MOV #40,R1 ; адрес начала служебных ячеек драйвера дисплея (режимы работы дисплея) 110320$:SEC ; установить бит переноса 110322$:ROR R0 110324$:BCS 110334 ; (BCS=BLO - меньше) прочитаны все ячейки ССД 110326$:TSTB (R1)+ 110330$:BNE 110320 110332$:BR 110322 110334$:MOV (SP)+,R1 110336$:RET ; сист порт в исх сост 110340$:MOV #220,@#177716 ; сохранить R0-R4 110346$:MOV R3,-(SP) 110350$:MOV R2,-(SP) 110352$:MOV R1,-(SP) 110354$:MOV R0,-(SP) 110356$:MOV R4,-(SP) 110360$:RTS R4 ; восстановить R0-R4 110362$:MOV (SP)+,R0 110364$:MOV (SP)+,R0 110366$:MOV (SP)+,R1 110370$:MOV (SP)+,R2 110372$:MOV (SP)+,R3 110374$:RTS R4 110376$:CLR 156 110402$:CALL 102414 ; 110406$:MOV 212,R0 110412$:MOV 160,R3 110416$:MOV 210,R2 110422$:ASR R2 110424$:MOV R0,(R3) 110426$:ADD #2,R3 110432$:BPL 110440 110434$:SUB 206,R3 110440$:SOB R2,110424 110442$:CLR R5 110444$:CALL 106536 ; 110450$:CLR 174 110454$:MOVB 155,154 110462$:CALL 111314 ; 110466$:RET 110470$:MOV 216,R1 110474$:MOV 204,R3 110500$:ADD 202,R3 110504$:MOV #20,R4 110510$:CALL 111450 ; 110514$:SOB R4,110510 110516$:MOV 220,R1 110522$:ADD #1400,R3 110526$:CALL 111474 ; 110532$:CALL 111130 ; ; вход с драйвера клавиатуры (с адреса 102040) ? 110536$:CLR R0 110540$:CLR 222 110544$:MOV #6,R2 110550$:MOV R0,-(SP) 110552$:MOV R2,-(SP) 110554$:CALL 110572 ; 110560$:MOV (SP)+,R2 110562$:MOV (SP)+,R0 110564$:INC R0 110566$:SOB R2,110550 110570$:RET ; 110572$:INC 224 110576$:TST 222 110602$:BNE 111126 110604$:CLR 224 110610$:MOV #43,R1 110614$:ADD R0,R1 110616$:ASL R0 ; сделать четным 110620$:ADD R0,PC ; получить адреса для BR 110622$:BR 110636 ; 110624$:BR 110654 ; 110626$:BR 110666 ; 110630$:BR 110700 ; 110632$:BR 110712 ; 110634$:BR 110724 ; ; 110636$:MOV #111734,R3 110642$:TSTB (R1) 110644$:BEQ 110770 110646$:MOV #111740,R3 110652$:BR 110770 ; 110654$:TSTB (R1) 110656$:BEQ 110764 110660$:MOV #111744,R3 110664$:BR 110770 ; 110666$:TSTB (R1) 110670$:BEQ 110764 110672$:MOV #111750,R3 110676$:BR 110770 ; 110700$:TSTB (R1) 110702$:BEQ 110764 110704$:MOV #111754,R3 110710$:BR 110770 ; 110712$:TSTB (R1) 110714$:BEQ 110764 110716$:MOV #111760,R3 110722$:BR 110770 ; 110724$:TSTB (R1) 110726$:BEQ 110764 110730$:TSTB 51 110734$:BEQ 110744 110736$:MOV #111770,R3 110742$:BR 110770 ; 110744$:MOV #111764,R3 110750$:TSTB 52 110754$:BEQ 110770 110756$:MOV #111774,R3 110762$:BR 110770 ; 110764$:MOV #112000,R3 ; от подпрограммы 110572 110770$:ASL R0 110772$:ADD #4,R0 110776$:MOV #100,R1 111002$:TSTB 53 111006$:BEQ 111012 111010$:ASR R1 111012$:SUB R0,R1 111014$:MOV #4,R2 111020$:MOV 212,-(SP) 111024$:MOV 214,-(SP) 111030$:MOV 40,-(SP) 111034$:MOV 44,-(SP) 111040$:MOV 216,212 111046$:MOV 220,214 111054$:MOVB 53,40 111062$:MOV 54,44 111070$:MOVB (R3)+,R0 111072$:MOV R3,-(SP) 111074$:CALL 107200 ; 111100$:MOV (SP)+,R3 111102$:INC R1 111104$:SOB R2,111070 111106$:MOV (SP)+,44 111112$:MOV (SP)+,40 111116$:MOV (SP)+,214 111122$:MOV (SP)+,212 111126$:RET ; вызов из подпрограммы 101332 - ? 111130$:MOV #100601,R5 ; 111134$:MOV #20,R4 111140$:TSTB 40 111144$:BEQ 111154 111146$:MOV #140003,R5 111152$:ASL R4 111154$:MOV 216,R1 111160$:BIC R5,R1 111162$:COM R5 111164$:MOV 220,R3 111170$:BIC R5,R3 111172$:BIS R3,R1 111174$:MOV 204,R3 111200$:SUB #300,R3 111204$:BIC #140000,R3 111210$:ADD 202,R3 111214$:MOV R3,R5 111216$:CALL 111474 ; 111222$:CLR R3 111224$:CLR R2 111226$:MOV 112(R3),R0 111232$:ROR R0 111234$:BCS 111244 111236$:BEQ 111276 111240$:INC R2 111242$:BR 111232 111244$:MOV R2,R1 111246$:TSTB 40 111252$:BNE 111264 111254$:ADD R5,R1 111256$:MOVB 220,(R1) 111262$:BR 111240 111264$:ASL R1 111266$:ADD R5,R1 111270$:MOV 220,(R1) 111274$:BR 111240 111276$:ADD #2,R3 111302$:ADD R4,R5 111304$:BIT #77,R5 111310$:BNE 111224 111312$:RET ; для кодов 221 222 223 224 111314$:TSTB 50 111320$:BNE 111336 111322$:CALL 103222 ; для кодов 221 222 223 224 при TSTB 50 =0 111326$:MOV #20000,106 111334$:BR 111350 111336$:CALL 106564 ; для кодов 221 222 223 224 при TSTB 50 не равно 0 111342$:MOV #2000,106 111350$:RET 111352$:CALL 103222 ; 111356$:INCB 152 111362$:CALL 102414 ; 111366$:CALL 103222 ; 111372$:RET 111374$:MOV 212,R0 111400$:MOV 160,R3 111404$:MOV #12,R2 111410$:TSTB 40 111414$:BNE 111422 111416$:MOVB R0,(R3) 111420$:BR 111424 111422$:MOV R0,(R3) 111424$:CALL 111434 ; подготовка для вывода строки 111430$:SOB R2,111410 ; цикл вывода (111410-111430) 111432$:RET ; подготовка для вывода строки ИЗ МАТРИЦЫ СИМВОЛА 111434$:ADD #100,R3 111440$:BPL 111446 111442$:SUB 206,R3 111446$:RET ; ----------------------------------------------------------------------------- ;### подпрограммы от EMT ... ####### ; сл ячейки 202 206 111450$:MOV #40,R2 111454$:CMP R3,202 111460$:BHI 111466 111462$:ADD 206,R3 111466$:MOV R1,-(R3) 111470$:SOB R2,111466 ; цикл вывода (111466-111470) 111472$:RET ; сл ячейки 206 111474$:MOV #40,R2 111500$:TST R3 111502$:BPL 111510 111504$:SUB 206,R3 111510$:MOV R1,(R3)+ 111512$:SOB R2,111510 ; цикл вывода (111510-111512) 111514$:RET ; сл ячейки 202 206 212 111516$:MOV R1,R3 111520$:SUB #1200,R3 111524$:CMP R3,202 111530$:BCC 111536 111532$:ADD 206,R3 111536$:TST R2 111540$:BEQ 111576 111542$:MOV #40,R4 111546$:MOV (R1)+,(R3)+ 111550$:SOB R4,111546 ; цикл вывода (111546-111550) 111552$:TST R1 111554$:BPL 111564 111556$:SUB 206,R1 111562$:BR 111574 111564$:TST R3 111566$:BPL 111574 111570$:SUB 206,R3 111574$:SOB R2,111542 ; цикл вывода (111542-111574) 111576$:MOV #12,R4 111602$:MOV 212,R1 111606$:CALL 111474 ; 111612$:SOB R4,111606 ; цикл вывода (111606-111612) 111614$:RET ; сл ячейки 202 206 212 111616$:MOV R1,R3 111620$:ADD #1200,R3 111624$:CMP R1,202 111630$:BHI 111636 111632$:ADD 206,R1 111636$:CMP R3,#100000 111642$:BLOS 111650 111644$:SUB 206,R3 111650$:TST R2 111652$:BEQ 111714 111654$:MOV #40,R4 111660$:MOV -(R1),-(R3) 111662$:SOB R4,111660 111664$:CMP R1,202 111670$:BHI 111700 111672$:ADD 206,R1 111676$:BR 111712 111700$:CMP R3,202 111704$:BHI 111712 111706$:ADD 206,R3 111712$:SOB R2,111654 111714$:MOV #12,R4 111720$:MOV 212,R1 111724$:CALL 111450 ; 111730$:SOB R4,111724 111732$:RET ; ----- ОБЛАСТЬ ЗНАКОГЕНЕРАТОРА 111734 - 116074 ------------------------------- 111734$:.WORD ??? ;... ;... ; ----------------------------------------------------------------------------- ; EMT 36 - драйвер магнитофона 116076$:EMT 36 ; но это какое-то зацикливание (обращение к самому себе = EMT36 EMT36 ...) ----- ? 116100$:RET ; ----------------------------------------------------------------------------- ; ----- ВХОД В СИСТЕМНОЕ ПЗУ - ПЕРЕХОД С АДРЕСА=100000 ------------------------ 116102$:MOV #1000,SP ; установить стек на адрес 1000 (это будет и в Мониторе) 116106$:CALL @#116116 ; начальные установки непонятно чего ? ОЗУ экрана ? 116112$:JMP @#100260 ; вход в Диалоговый Монитор ; начальные установки при включении - какие-то непонятные действия с ОЗУ экрана ----- ; (возможно регистр рулонного сдвига можно настроить на другую область ОЗУ ? ) ; если вход не с 116116 то возможно это триггерное переключение режимов экрана РП-полный экран и наоборот 116116$:MOV @#177664,R0 ; прочитать регистр рулонного сдвига ### (? ЗАЧЕМ - он же еще не установлен) ### 116122$:SWAB R0 116124$:ROR R0 116126$:CLR R4 116130$:ROR R0 116132$:MOV #100,R2 116136$:ADD #45000,R0 116142$:MOV R0,R1 116144$:SUB #40000,R1 116150$:MOV #200,R3 116154$:TST R0 116156$:BPL 116164 116160$:SUB #40000,R0 116164$:CMP #40100,R1 116170$:BLE 116176 116172$:ADD #40000,R1 116176$:MOV #177777,-(R1) ; очистка ОЗУ экрана (100000-40000) 116202$:MOV #177777,(R0)+ ; очистка ОЗУ пользователя (0-40000) 116206$:TST R4 116210$:BEQ 116216 116212$:CLR (R4)+ 116214$:CLR -(R5) 116216$:BIT #77,R0 116222$:BNE 116176 116224$:MOV #77,R5 116230$:SOB R5,116230 ; задержка 116232$:MOV R1,R5 116234$:ADD R2,R5 116236$:MOV R0,R4 116240$:SUB R2,R4 116242$:SOB R3,116154 ; цикл (116154-116242) 116244$:CLRB -(R0) 116246$:CLRB (R4)+ 116250$:CLRB (R1)+ 116252$:CLRB -(R5) 116254$:MOV #1400,R3 116260$:SOB R3,116260 ; задержка ( ? ) 116262$:SOB R2,116244 ; цикл (116244-116262) 116264$:RET ; ----- есть ли ссылки на адрес 116266 ??? здесь нет обращений к подпрограммам!!! ----- ; 116266$:MOV #177766,R2 116272$:CLR R0 116274$:CLR R1 116276$:MOV #7416,R5 116302$:ADD R0,R5 116304$:MOV (R5),R3 116306$:ADD R2,R3 116310$:CMP R3,#0 116314$:BLT 116354 116316$:CMP R3,#37 116322$:BGT 116354 116324$:MOV #40000,R5 116330$:ADD R1,R5 116332$:ADD R3,R5 116334$:MOVB #252,(R5) 116340$:MOV #40077,R5 116344$:ADD R1,R5 116346$:SUB R3,R5 116350$:MOVB #252,(R5) 116354$:MOV #7416,R5 116360$:ADD R0,R5 116362$:MOV (R5),R3 116364$:ADD R2,R3 116366$:SUB #6,R3 116372$:CMP R3,#0 116376$:BLT 116432 116400$:CMP R3,#77 116404$:BGT 116432 116406$:MOV #40000,R5 116412$:ADD R1,R5 116414$:ADD R3,R5 116416$:CLRB (R5) 116420$:MOV #40077,R5 116424$:ADD R1,R5 116426$:SUB R3,R5 116430$:CLRB (R5) 116432$:ADD #100,R1 116436$:INC R0 116440$:INC R0 116442$:BIC #177701,R0 116446$:CMP R1,#40000 116452$:BCS 116276 116454$:INC R2 116456$:CMP R2,#60 116462$:BLT 116272 116464$:RET ; ----------------------------------------------------------------------------- ; автор эмулятора стер EMT 36 - зачем ? ; ############################### !!! здесь было EMT 36 !!! ######################### ; в каком то из выпусков ПК-БК полностью есть драйвер EMT 36 с описанием - в выпуске КПСС указана его ; длина=1700 ? 116466$:NOP ... ... ... 117456$:NOP 117460$:RET ; ----------------------------------------------------------------------------- ; ----- работа с линией ТЛГ --------------------------------------------------- ; EMT 40 - инициализация линии ТЛГ (номер скорости в R0, чем меньше число-тем больше скорость. При R0=0 скорость 9600 бод) 117462$:ASL R0 117464$:MOV 117740(R0),254 ; установить скорость линии ТЛГ. В ячейке 254 величина программной задержки для заданного 117472$:RET ; номера скорости ; EMT 42 - передача байта на линию (R0 - мл байт для передачи) 117474$:MOV R0,-(SP) 117476$:MOV R4,-(SP) 117500$:BIS #1400,R0 ; добавить СТОП-бит (маска 1100000000) 117504$:MOV #13,R4 ; число передаваемых бит=11Д(СТАРТ-бит + 8бит данных + 2 СТОР-бита) 117510$:BIT #200,@#177716 ; прочитать бит готовности ТЛГ 117516$:BEQ 117510 ; ожидать готовность принимающей стороны 117520$:CLC ; сбросить бит переноса-в него будет выдвигаться из младшего разряда бит для передачи 117522$:BR 117526 ; сначала СТАРТ-бит (перевод линии данных из 1 в 0 т.к. бит переноса сброшен командой CLC) 117524$:ASR R0 ; младшими битами вперед 117526$:BCC 117540 ; (нет переноса) бит 0 117530$:MOV #220,@#177716 ; выдать бит 1 (длительность в цикле 117554 задается R5 по содержимому ячейки 254) 117536$:BR 117550 117540$:MOV #200,@#177716 ; выдать бит 0 (длительность в цикле 117554 задается R5 по содержимому ячейки 254) 117546$:BR 117550 117550$:MOV 254,R5 ; константа скорости ТЛГ 117554$:SOB R5,117554 ; задержка 117556$:SOB R4,117524 ; цикл передачи байта (117524-117556) - линия остается в 1 (режим СТОР) 117560$:MOV (SP)+,R4 117562$:MOV (SP)+,R0 117564$:RET ; EMT 44 - прием байта с линии (принятый байт будет в младшем байте R0) 117566$:MTPS #0 ; ССП=0 разрешить прерывания в цикле ожидания готовности передатчика 117572$:MOV R3,-(SP) 117574$:MOV R4,-(SP) 117576$:MOV #177716,R3 ; адрес системного порта в R3 117602$:MOV #20,R4 ; число для битовой маски 00010000 (разряд 4 системного порта - это прием с линии ТЛГ) 117606$:CLR R0 ; готовим R0 для приема байта с линии ТЛГ 117610$:BIT R4,(R3) ; проверить готовность передающей стороны (маска 00010000) 117612$:BEQ 117610 ; ожидать готовности, 117614$:MOV #260,(R3) ; выдать свой сигнал готовности к приему 117620$:BIT R4,(R3) ; проверить СТАРТ-бит 117622$:BNE 117614 ; ожидать СТАРТ-бит если его нет 117624$:MTPS #200 ; ССП=200 запретить прерывания во время приема данных 117630$:MOV 254,R5 ; константа скорости ТЛГ 117634$:ASR R5 ; середина битового интервала 117636$:SOB R5,117636 ; задержка в цикле приема СТАРТ-бита 117640$:ASR R4 ; R4 использован по совместительству в цикле приема (R4=20 - ASR R4 - R4=10=8Д бит для приема) 117642$:MOV 254,R5 ; константа скорости ТЛГ 117646$:SOB R5,117646 ; задержка (попадаем в середину битового интервала - отсчет задержки идет от середины СТАРТ-бита) 117650$:BIT #20,(R3) ; прочитать информационный бит 117654$:BNE 117662 ; информационный бит не 0 (=1) 117656$:CLC ; сбросить бит переноса (принят бит 0) 117660$:BR 117666 ; на запись принятого бита в R0 117662$:SEC ; установить бит переноса (принят бит 1) 117664$:BR 117666 ; для выравнивания задержек при приеме 0 и 1 117666$:RORB R0 ; вдвигаем принятый бит вправо через старший разряд (передача идет младшим битом вперед) 117670$:SOB R4,117642 ; цикл приема байта (117642-117670) 117672$:MOV #220,(R3) ; снимаем сигнал готовности ТЛГ 117676$:MOV (SP)+,R4 117700$:MOV (SP)+,R3 117702$:RET ; EMT 46 - передача массива по линии (R1-адрес массива на передачу R2-длина массива в байтах) 117704$:MOV R0,-(SP) 117706$:MOVB (R1)+,R0 117710$:CALL 117474 ; передача байта на линию 117714$:SOB R2,117706 ; цикл передачи массива (117706-117714) 117716$:MOV (SP)+,R0 117720$:RET ; EMT 50 - прием массива с линии (R1-адрес следующего за принятым массивом байта R2=0) 117722$:MOV R0,-(SP) 117724$:CALL 117566 ; прием байта с линии 117730$:MOVB R0,(R1)+ 117732$:SOB R2,117724 ; цикл приема массива (117724-117732) 117734$:MOV (SP)+,R0 117736$:RET ;---------- Константы для скорости ТЛГ ----- В БК нет скоростей 200-100 ----- 117740$:.WORD 14 ; константа для скорости ТЛГ = 9600 бод (число в цикле задержки) 117742$:.WORD 36 ; константа для скорости ТЛГ = 4800 бод 117744$:.WORD 103 ; константа для скорости ТЛГ = 2400 бод 117746$:.WORD 213 ; константа для скорости ТЛГ = 1200 бод 117750$:.WORD 435 ; константа для скорости ТЛГ = 600 бод 117752$:.WORD 1100 ; константа для скорости ТЛГ = 300 бод 117754$:.WORD 1542 ; константа для скорости ТЛГ = 200 бод 117756$:.WORD 2206 ; константа для скорости ТЛГ = 150 бод 117760$:.WORD 3300 ; константа для скорости ТЛГ = 100 бод 117762$:.WORD 4422 ; константа для скорости ТЛГ = 75 бод 117764$:.WORD 6633 ; константа для скорости ТЛГ = 50 бод 117766$:.WORD 0 117770$:.WORD 0 117772$:.WORD 0 117774$:.WORD 0 117776$:.WORD 111111 ; контрольная сумма ПЗУ Монитора ? ;############################ КОНЕЦ ПЗУ МОНИТОРА ################################################################