Академический Документы
Профессиональный Документы
Культура Документы
Теперь нужно кое-что объяснить (хотя, по большому счету, это относится вообще ко
всей моей информации).
Если я сейчас начну объяснять работу "новой" программы (BP_9.asm), то вполне
вероятен "геморройнопонятийный конфуз", связанный с "блочно-страничными делами".
Мой "внутренний цензор" настоятельно советует сделать это только после целевого
растолковывания "сермяжной сути всего этого безобразия/мозгозаворота".
И игнорировать совет этой таинственной и могущественной субстанции я не буду, так
как, во-первых, дураком себя не считаю, а во-вторых, не желаю ставить Вас в
дурацкое положение.
К тому же, речь идет не только о конкретной программе, а вообще о всех
программах, в которых имеются ПП вычисляемых переходов, а тем паче, о тех
программах, объемы текстов которых "зашкаливают" за одну страницу памяти программ
(без соответствующих знаний/навыков, вообще "Караул!!!").
Коррекция положения нижней части челюсти. Боевая настройка биофункций. Старт.
Итак, с учетом того, что сделано на данный момент, объем текста текущей программы
"зашкалил" за первую страницу памяти программ.
Пояснение: 1-й страницей памяти программ я называю ту страницу, которая в
даташитах называется нулевой страницей памяти программ.
Соответственно, далее (и "до того" тоже), вся нумерация страниц памяти программ, в
моем толковании, будет иметь вид 1, 2, 3, … страница, а не 0, 1, 2, … страница.
Причина: не нравится мне нулевая страница. Образ (аналогию с книгой) сильно
портит. Где это видано, чтобы книга начиналась с нулевой страницы?
Если какой угодно стандарт вступает в противоречие с удобным образом (жизненной
аналогией), то лично я, выбираю образ (однозначно) и создаю свой личный стандарт.
То же самое можно было бы "провернуть" и по отношению к нумерации банков, но я
не стал ее менять, так как образ банка мне абсолютно "по барабану" (в душе ничего
не "шевелится". "Бревно").
Не был я в этом образе. И не буду, так как не хочу.
Еще раз обращаю Ваше внимание на то, что образы это не блажь воспаленного
воображения и не признак ненормальности, а подчинение подсознания
(мощнейший "инструмент"!!!) сознанию.
Тем, кто это игнорирует, я совсем не завидую, так как такого рода упорство (а может
быть и лень) резко снижает вероятность особо эффективных "падений на голову
разнообразнейших яблок", что эквивалентно потере чего-то важного.
Так что не обессудьте.
Ранее, в подразделе 1/3 второй части "Практикума…", была затронута тема
числовой коррекции содержимого регистра PCLATH, как в общем виде, так и
применительно к тем конкретным "железякам", которые "подвергалась пыткам".
При этом, основное внимание было уделено числовой коррекции содержимого регистра
PCLATH с помощью операторов high и low, обеспечивающих универсальность такой
коррекции (комфорт).
Начну с оператора low.
Если речь идет о какой-то рациональности, то оператор low целесообразно применять
не во всех случаях (но можно и во всех. Не возбраняется), а только в тех, когда есть
"реальная угроза прохождения границ", между блоками памяти программ, через
таблицы вычисляемых переходов.
Намек: если "раскидывать" ПП вычисляемых переходов абы как (системность
отсутствует), то эта "реальная угроза" будет присутствовать всегда и о рациональности
можно не мечтать.
1
В операторе low, больше всего привлекает то, что применив его, можно не "забивать
себе голову" указанной выше проблемой.
То есть, речь идет о своего рода комфорте: в случае задействования оператора low,
при условии организации соответствующей, программной коррекции содержимого
регистра PCLATH, ПП вычисляемых переходов можно "раскидать" (в PC) как угодно.
Не обращая внимания на "границы" между блоками.
Лично я, совсем не против комфорта, но в пределах выгодного/разумного, ведь
общеизвестно, что за комфорт нужно чем-то расплачиваться.
А именно, "расплата" заключается в увеличении количества команд и соответственно, в
"затяжке" времени отработки того, что связано с ПП вычисляемого перехода.
При таком "раскладе", если в цикле программы отрабатывается много таких
подпрограмм, то и "затяжка" увеличивается кратно.
Если это время не лимитировано или устраивает, и в памяти программ "полно
свободного места", то и ограничений по "массовому применению" оператора low, нет.
Применяйте на здоровье. Это очень удобно.
В тех же случаях, когда количество команд и скорость важны, а также если речь идет
о принципиальной (эстетическо-идейной) минимизации объема программы (не ее текста,
а того, что "лежит" в PC), лучше обойтись без оператора low.
Для этого, всего-то и нужно, по-умному "раскидать" ПП вычисляемых переходов в
памяти программ.
Начиная с сАмого ее "верха", а не с "геморройных середины и низа" (условно).
Обращаю Ваше внимание на слово "сАмого".
Если в программе нет ПП прерывания, то в идеале, речь идет о нулевом адресе PC.
В этом случае, "блочная фора" - 255 команд (ячеек PC).
Если Вы "свАлите", в эту "зону", все или часть подпрограмм вычисляемых переходов
(с учетом того, что блок не "резиновый"), то Вы совсем не ошибетесь, так как, в ходе
дальнейшей работы над текстом программы (изменения ее "массы"), все эти ПП
вычисляемых переходов (группа) либо вообще не будут смещаться вниз, либо
будут, но в пределах дозволенного ("расшифровка" - см. ниже).
Соответственно, речь идет о двух вариантах:
Могут быть различные варианты такого рода "наведения верхнего порядка", но смысл
один и тот же - приведение всех групп ПП вычисляемых переходов к такому
состоянию, при котором "переходы границ" отсутствуют.
Если выражаться по-русски, то эту "процедуру" можно назвать "устаканиванием".
Во многих случаях, "устаканиваться" даже и не нужно, так как все изначально
"устаканено" ("формальности соблюдены" и изменений "массы" нет), но случаи всякие
бывают. На то они и случаи.
Предположим, что все окончательно "устаканилось".
В том смысле, что до окончания работы с программой (и на дальнейшие "веки
вечные"), "масса" всех групп ПП вычисляемых переходов неизменна.
Получается очень даже симпатично: вне зависимости от того, что будет
"твориться в основном теле" программы, "угроза прохождения границы",
между блоками памяти программ, через таблицу вычисляемого перехода, будет
напрочь отсутствовать.
Вывод: с учетом сказанного, все ПП вычисляемых переходов нужно "валить"
(по-умному) в "верхушку" памяти программ (если говорить о тексте программы, то
в "верхушку" верхней "обслуги").
Если в программе есть ПП прерывания, то смысл тот же самый, только с учетом того,
что первую группу ПП вычисляемых переходов нужно разместить сразу же после ПП
прерывания (именно так и сделано в программах BP_ …).
В этом случае, задача несколько усложняется, так как по ходу работы, в ПП
прерывания могут быть внесены изменения, но все-равно это лучше, чем "засовывать"
ПП вычисляемых переходов в "середину"/"конец" (условно) "основного тела" программы.
В последнем случае, вероятность смещения, при корректировке текста программы,
высока.
И она тем выше, чем ближе, к "концу основного тела" программы, расположена группа
ПП вычисляемых переходов (или отдельная ПП вычисляемого перехода).
Например, если группа ПП вычисляемых переходов (или несколько таких групп) будет
"дислоцироваться" в "районе конца" текста программы (в нижней "обслуге"), то
результатом большинства корректировок "вышележащего" текста программы, будет
смещение этой группы в PC (вверх или вниз).
Естественно, что не все эти смещения приведут к "вычисляемо-переходным бякам", но
некоторые приведут.
Короче, вопрос везения. Может повезти, а может и нет.
На мой взгляд, такой подход к делу совершенно не серьезен ("детский сад").
Если не повезет, то неизбежно придется вплотную познакомиться с "Гитлер капутом".
Радости от него вообще никакой. Одна подлость, ехидство и изнасилование мозгов.
Причем, в особо извращенной форме (бывает такое, что "мозги завязываются на
N-узлов").
3
Думаю, что многие из Вас совсем не по наслышке знакомы с этим "капутом".
Примечание: а уж как я с ним знаком … Ближе некуда. Если бы не его подлость, то
был бы другом.
Вывод: "Учиться, учиться и еще раз учиться!" (… сами знаете кто. Присоединяюсь).
В случае же того, на что я Вам намекаю (с учетом "соблюдения формальностей и
устаканивания"), смещаться будет то, что расположено ниже групп ПП вычисляемых
переходов, и эти группы, при любом "объеме" корректировки всего того, что "лежит"
ниже, будут "стоять как вкопанные".
А раз это так, то от применения оператора low можно просто-напросто отказаться.
Следствием этого будет уменьшение объема текста программы и увеличение скорости
отработки ее полного цикла (по сравнению со случаем применения оператора low).
Теперь вдумайтесь в сказанное.
Это есть не что иное, как "элементарное наведение порядка", результатом которого
является некий "выигрыш".
Просто нужно знать, зачем и как именно его "наводить".
"Ковыляю" дальше.
Вопрос: "А что делать с промежутками между группами? Ведь вероятность
идеального "вписывания" в блок, группы ПП вычисляемых переходов, хотя и есть, но
мала".
Ответ: все правильно. Значит нужно озаботиться тем, как именно организовать эти
промежутки. Для случаев "неидеального вписывания" (их - подавляющее большинство).
Такая постановка вопроса неумолимо наталкивает на мысль о том, что соседние
группы подпрограмм вычисляемых переходов нужно как-то "разнести" в памяти
программ (не абы как, а по-умному, отделить друг от друга), а иначе, все
"вышележащее предтарахтенье и гроша ломаного не стОит".
Пояснение: промежутком я называю количество ячеек памяти программ между
последней командой предыдущей (верхней) группы подпрограмм вычисляемых
переходов (последней, по тексту, команды retlw xxx) и 1-й командой последующей
(нижней) группы подпрограмм вычисляемых переходов (addwf PC,F), которая
(команда) расположена в сАмой "верхушке" блока.
Каковы "механизмы разнесения"?
4
При помощи директивы ORG, можно задать любой адрес (произвести любое
смещение), но в данном случае, нужно задать адрес той ячейки последующего (по
отношению к предыдущему) блока памяти программ, которая "дислоцируется" либо в
самом начале последующего блока PC (смещение равно промежутку), либо ниже, но
желательно, в непосредственной близости от начала последующего блока PC
(смещение с тем или иным превышением промежутка).
И эту "компромиссную конкретику" также определяет программист.
Все это конечно распрекрасно, но лучше один раз увидеть, чем 100 раз "протарахтеть".
Реализую эту "концепцию".
Примеры взяты из программы BP_9.asm.
Пример №1:
Пример №2:
Пример №3:
А это тот случай, когда при обеих коррекциях содержимого регистра PCLATH,
применение оператора high оправдано.
Исходные данные такие.
До вызова ПП PAUSE_S, PCLATH = 0000 1000 (в PCLATH установлен 1-й блок 2-й
страницы).
ПП PAUSE_S "дислоцируется" в 7-м блоке 1-й страницы (в PCLATH нужно выставить
0000 0110).
После возврата из ПП PAUSE_S, первая ПП вычисляемого перехода, которая будет
отработана по ходу исполнения программы (TEXT_26), "лежит" в 1-м блоке 2-й
страницы (в PCLATH нужно выставить 0000 1000).
То есть, до команды call PAUSE_S, имел место быть PCLATH = 0000 1000.
Для того чтобы ПП PAUSE_S была отработана "безглючно", перед вызовом ПП
PAUSE_S, нужно установить PCLATH = 0000 0110, а после возврата из ПП PAUSE_S,
для того, чтобы ПП TEXT_26 была отработана "безглючно", перед вызовом ПП
TEXT_26, нужно установить PCLATH = 0000 1000.
При таком "раскладе", выгодно воспользоваться оператором high и не "забивать себе
голову" всякими bcf/bsf/movlw/movwf, так как, от применения последнего, нет никакого
выигрыша.
А раз это так, то да здравствует комфорт.
Для того чтобы этот или другой вывод имел место быть, нужно, как минимум,
прикинуть что к чему (знать "подноготную", "руку набить"), а иначе, откуда взяться
объективному выводу?
Вот и вся "сермяжная суть/идеология" (понять легко, не легко "воплотить").
И еще один нюанс.
Вызов ПП TEXT_26 (call TEXT_26) может произойти не обязательно сразу же после
отработки того, что Вы видите выше, а "на каком-то удалении".
9
Хоть через 100 (условно) команд.
Если работа происходит в "границах" одной страницы памяти программ, то оператор
high должен быть "ориентирован" на название ПП, указанное в "рабочей" части
ближайшего (по ходу исполнения программы) вызова подпрограммы вычисляемого
перехода (call <название ПП>).
Естественно, при условии, что числовое значение PCLATH, необходимое для
"нормального функционирования" этой ПП, отличается от ранее установленного
значения PCLATH.
Если же таких отличий нет, то и "нечего огород городить".
То есть, если имеет место быть последовательная отработка группы
подпрограмм вычисляемых переходов, "лежащих" в одном и том же блоке
памяти программ и на одной и той же странице памяти программ, то
достаточно скорректировать содержимое PCLATH только "на влёте" в эту
группу, а далее, вплоть до окончания отработки этой группы,
корректировать содержимое PCLATH не нужно (зачем подтверждать то ранее
установленное состояние, которое и нужно?).
Сказанное есть дополнительное подтверждение рациональности размещения
подпрограмм вычисляемых переходов в составе "плотной группы", а не их
"раскиданности где попало", а заодно и подтверждение значимости элементарного
порядка.
Пример №4:
Этот пример иллюстрирует тот случай, когда применение оператора high вынуждает
сначала сохранять содержимое W, подготовленное для 2/10 преобразования, в регистре
общего назначения Reg_3, а затем, после коррекции содержимого PCLATH,
восстанавливать "утраченное" (но мудро сохраненное) содержимое W (выделено синим
цветом).
Пример №5:
TERMO На "влете": 0000 1ххх / ххх (не имеет значения) блок 2-й страницы.
........................
Есть команды call и goto
........................
movlw high TEXT_17; Выбор PCH 1-й команды ПП TEXT_17
movwf PCLATH ; (находится во 2 блоке 1-й страницы:
; 0000 0001).
call SL_I_POVIN ; Переход в ПП вывода на индикацию этой
; надписи.
;--> Возврат по стеку из ПП SL_I_POVIN.
bsf PCLATH,3 ; Выбор 2-й страницы.
На "вылете": 0000 1001 / 2-й блок 2-й страницы.
........................
........................
Возможно исполнение команды call, не связанной с вычисляемым переходом (один из
сценариев 1-го ветвления).
........................
........................
10
На "влете": 0000 1001 / 2-й блок 2-й страницы.
bcf PCLATH,0 ; Выбор 1-го блока 2-й страницы.
На "вылете": 0000 1000 / 1-й блок 2-й страницы.
........................
........................
На "влете": 0000 1000 / 1-й блок 2-й страницы.
clrf PCLATH ; Выбор 1-го блока 1-й страницы (0000 0000).
call MULTI ; Переход в ПП аварийной "пищалки".
;----> Возврат по стеку из ПП MULTI.
bsf PCLATH,3 ; Выбор 1-го блока 2-й страницы.
На "вылете": 0000 1000 / 1-й блок 2-й страницы.
........................
........................
На "влете": 0000 1000 / 1-й блок 2-й страницы.
movlw high PAUSE_S; Выбор PCH 1-й команды ПП PAUSE_S
movwf PCLATH ; (находится в 7-м блоке 1-й страницы:
; 0000 0110).
call PAUSE_S ; Задержка.
;----> Возврат по стеку из ПП PAUSE_S.
movlw high TEXT_26; Выбор PCH 1-й команды ПП TEXT_26
movwf PCLATH ; (находится в 1-м блоке 2-й страницы:
; 0000 1000).
На "вылете": 0000 1000 / 1-й блок 2-й страницы.
........................
........................
На "влете": 0000 1000 / 1-й блок 2-й страницы.
movlw high IND_TERMO; Выбор PCH 1-й команды ПП IND_TERMO
movwf PCLATH ; (находится в 7-м блоке 1-й страницы:
; 0000 0110).
call IND_TERMO ; Переход в ПП IND_TERMO.
;----> Возврат по стеку из ПП IND_TERMO.
movlw high TEXT_27; Выбор PCH 1-й команды ПП TEXT_27
movwf PCLATH ; (находится в 1-м блоке 2-й страницы:
; 0000 1000).
На "вылете": 0000 1000 / 1-й блок 2-й страницы.
........................
........................
На "влете": 0000 1000 / 1-й блок 2-й страницы.
movlw high IND_TERMO; Выбор PCH 1-й команды ПП IND_TERMO
movwf PCLATH ; (находится в 7 блоке 1-й страницы:
; 0000 0110).
call IND_TERMO ; Переход в ПП IND_TERMO.
;----> Возврат по стеку из ПП IND_TERMO.
;================================================================================
; Обеспечение необходимого времени "высвечивания" надписи.
;================================================================================
call PAUSE_S ; Задержка.
;----> Возврат по стеку из ПП PAUSE_S.
bsf PCLATH,3 ; Выбор 2-й страницы.
На "вылете": 0000 1110 / 7-й блок 2-й страницы.
........................
........................
Второе ветвление
btfsc Status,C ; Результат "+/=0" или "-"
; (порог превышен или нет) ?
Сценарий "закольцовки"
goto TERMO ; Если порог превышен, то ПП TERMO исполняется
; снова (с поднятым флагом срабатывания
; термозащиты).
Сценарий "программа исполняется далее"
........................
На "влете": 0000 1110 / 7-й блок 2-й страницы.
movlw high TEXT_28; Выбор PCH 1-й команды ПП TEXT_28
movwf PCLATH ; (находится на 2-й странице).
На "вылете": 0000 1000 / 1-й блок 2-й страницы.
........................
11
........................
На "влете": 0000 1000 / 1-й блок 2-й страницы.
movlw high PAUSE_S; Выбор PCH 1-й команды ПП PAUSE_S
movwf PCLATH ; (находится в 7-м блоке 1-й страницы:
; 0000 0110).
call PAUSE_S ; Задержка.
;----> Возврат по стеку из ПП PAUSE_S.
На "вылете": 0000 0110 / 7-й блок 1-й страницы.
return ; Возврат из ПП TERMO (на 1-ю страницу).
А это более сложный пример наиболее оптимальных (на мой взгляд), многократных
предустановок (коррекций) PCLATH, производимых во внутреннем цикле достаточно
"мощненькой" подпрограммы (made in КЕА).
В том числе и с учетом наличия классических, двухсценарных ветвлений, отработка
сценариев которых, связана с необходимостью предустановки PCLATH (не все
ветвления связаны с предустановкой PCLATH).
Пока и двух таких ветвлений достаточно, но их может быть и больше.
В данном случае, в "PCLATH-контексте", существенно то, что один из сценариев
первого ветвления предполагает исполнение команды call (см. выделенное зеленым
цветом).
По первому сценарию второго ветвления, происходит "закольцовка" на начало ПП
TERMO, а по второму сценарию, этой "закольцовки" не происходит, и "программа
исполняется далее".
Этот "PCLATH-мозгозаворот" работает так.
ПП TERMO "лежит" на 2-й странице памяти программ.
Все вызовы ПП TERMO происходят из 1-й страницы памяти программ.
Значит, "войти" в ПП TERMO нужно с заранее выбранной, 2-й страницей памяти
программ.
Что и происходит непосредственно перед вызовом (вызов происходит из 1-й страницы
памяти программ):
........................
bsf PCLATH,3 ; Выбор текущего блока 2-й страницы.
call TERMO ; Переход в ПП работы с датчиком.
;--> Возврат по стеку из ПП TERMO.
........................
После того, как это благое и необходимое дело свершится, можно не опасаться
"PCLATH-бяк" со стороны команд call (не связанных с вычисляемыми переходами) и
goto, отрабатываемых до первого (по ходу исполнения ПП TERMO) вызова ПП
вычисляемого перехода (см. пункт 6e "правил игры").
Примечание: в данном случае, такие команды есть.
По ходу исполнения ПП TERMO, первой отрабатывается ПП вычисляемого перехода
(TEXT_17), входящая в состав ПП SL_I_POVIN (вывод на индикацию надписи
СЛУШАЮСЬ и ПОВИНУЮСЬ!.
"Координаты" ПП TEXT_17: 2-й блок 1-й страницы.
Именно поэтому, перед вызовом ПП SL_IPOVIN, в PCLATHе и нужно "выставить эти
координаты". Что и имеет место быть (используется оператор high).
ПП SL_I_POVIN, кроме ПП TEXT_17, содержит в своем составе и аналогичную ПП
вычисляемого перехода с названием TEXT_18.
Обе они "лежат" во 2-м блоке 1-й страницы.
Поэтому, перед исполнением ПП TEXT_18, предустанавливать PCLATH не нужно
(теория - см. выше).
Возврат из ПП SL_I POVIN осуществляется из 1-й страницы (PCLATH,3 = 0).
Далее, страница изменяется (bsf PCLATH,3).
Причина: один из сценариев первого ветвления предполагает исполнение команды call,
не связанной с вычисляемым переходом (см. выделенное зеленым цветом).
Если, перед исполнением этой команды, не предустановить 2-ю страницу, то всем Вам
хорошо известная рабочая точка "улетит" не туда, куда нужно, а туда, "где Макар
телят не гонял" (в совсем не нужное "место" 1-й страницы, которое, кстати,
элементарно "вычисляется").
То есть, результатом исполнения этого сценария будет "двухсотпроцентный глюк".
12
Примечание: в данном случае, речь идет о команде call (не связанной с ПП
вычисляемого перехода), которая имеет отношение к ветвлению, но то же самое
относится и к командам call (не связанным с ПП вычисляемых переходов), которые не
имеют отношения к ветвлениям и к командам goto, которые или имеют, или не имеют
отношения к ветвлениям. Вот такая получается "свистопляска".
Короткий вопрос: "В чем причина этой изумительной/шокирующей неожиданности
(глюка)"?
Короткий ответ: в "глубочайше-сермяжном" смысле, заложенном в пункте 6е
"вышележащей, серенькой" таблицы (она хоть и невзрачная, но довольно-таки
премудрая).
Какая страница, на "вылете" из первой предустановки, установлена в PCLATH?
Первая (см. "дислокацию" ПП TEXT_17).
Чего "вожделеем"?
Исполнения "того-сего" (связанного с call/goto/пунктом 6e), "лежащего" на 2-й странице.
Ну и в чем дело? bsf PCLATH,3 (ОСОЗНАННО !!!), и все дела.
Именно так и "закаляется сталь".
А кто не поймет "сермяжного" (напоминаю про "12 стульев") смысла сказанного, тот
будет частенько напрягаться, "выковыривая рабочую точку из всяческих непотребных
мест" (типа "бардель"), коих великое множество.
Сказанное относится и ко всем остальным командам call/goto, подпадающими под пункт
6e (вся ПП TERMO "лежит" на 2-й странице памяти программ), просто я не стал
"разрисовывать" все эти call/goto по причине того, что ПП TERMO "совсем не хилая".
Сейчас, главное - понять общий принцип (стратегию) "делания PCLATH-дел".
В части касающейся пункта 6e, вне зависимости от того, есть ветвления
или их нет, этот принцип прост: команды call/goto должны исполняться
только при условии наличия в бите №3 регистра PCLATH того признака
страницы памяти программ (0 или 1), на которой "дислоцируются" эти
команды.
Еще раз напоминаю причину такого "расклада": команды call/goto работают только в
"границах" одной страницы памяти программ ("пересечь границу" страницы памяти
программ они не могут).
А именно, той страницы, которая, на момент начала исполнения этих команд,
установлена в бите №3 регистра PCLATH (в случае работы с двухстраничным ПИКом.
Если страниц больше, то задействуется и бит №4).
Можете в этом убедиться (см. выше): какие бы "PLATCH-катаклизмы" не происходили,
в конечном итоге, на выходе из коррекции содержимого регистра PCLATH, в его бите
№3, всегда устанавливается единица (для случая работы на 2-й странице памяти
программ).
Имеется несколько таких коррекций, что для "не хилой" подпрограммы, вполне
естественно и сильно удивляться этому не стОит.
Я не стал "расписывать" каждую из них, так как смысл этих коррекций одинаков.
Только вариации разные.
Сказанного и показанного выше, на мой взгляд, вполне достаточно для того, чтобы
разобраться со всеми этими, а также и прочими вариациями.
Остановлюсь только на 2-м ветвлении.
Если будет иметь место быть сценарий "программа исполняется далее", то опять же,
смысл "шевеления" прежний.
Если будет иметь место быть сценарий "закольцовки" на начало ПП TERMO, то "влёт"
в нее будет произведен с PCLATH,3 = 1, что и требуется.
Напоминаю, что первый "влёт" в ПП TERMO (с "аэродрома" 1-й страницы)
производится с PCLATH,3 = 1.
Возврат из ПП TERMO производится с PCLATH,3 = 0.
Это и нужно, так как в данном случае, все вызовы ПП TERMO производятся из 1-й
страницы памяти программ.
В части касающейся возврата, получилось удачно.
В случае же "неудачности" (возврат с PCLATH,3 = 1), перед возвратом из ПП TERMO,
нужно "принудительно" выставить PCLATH,3 = 0.
15