Вы находитесь на странице: 1из 17

2-2/18.

Уменьшение "объема" программы за счет оптимизации подпрограмм


табличных, вычисляемых переходов (практикум).

На сей момент, общая структура "ЖК-управленческих дел", в основном, сформирована.


А раз это так, то самое время "заоптимизировать" ПП табличных, вычисляемых
переходов.
Значит, нужно выбрать тип их оптимизации.
В "глобальном смысле", в результате оптимизации, можно получить (по отношению к
"матери"):
- выигрыш и по командам, и по скорости,
- выигрыш по командам, без выигрыша по скорости или с проигрышем по скорости,
- выигрыш по скорости, без выигрыша по командам или с проигрышем по командам.
На данном этапе работы, проигрыш по командам совсем не нужен.
Особенно в части касающейся 1-й страницы памяти программ
(вот "переносогеморроя-то будет"…).
Нужен выигрыш по командам.
В данном случае, выигрыш по скорости второстепенен, так как в части касающейся
вывода данных на индикацию, для того чтобы надписи "высвечивались не с
реактивным свистом", нужно даже вводить, в текст программы, дополнительные
задержки.
Короче, в части касающейся скорости, пусть будет так, как получится: будет выигрыш
по скорости, ну и ладушки, а не будет - тоже ладушки.
Коррекция значения времязадающих констант, и все дела (в данной ситуации, это "как
слону дробинка").
Если такая коррекция вообще потребуется.
Вопрос: "Почему важен именно выигрыш по командам"?
Ответ: потому, что нужно видеть дальше собственного носа (зорко и умно
вглядываться в голубые дали).
То есть, в подобного рода ситуации, любой, уважающий себя и других, конструктор,
просто обязан как следует озаботиться дальнейшим обеспечением "потенциальных,
детородных возможностей текущенавороченного" (дальнейшего развития, в том числе и
в пока неведомых направлениях, никто не отменял).
Особенно в части касающейся 1-й страницы PC ("матка" это "не фунт изюма", а
основа "всего сущего").
Значит, под это дело, нужно обеспечить соответствующий "моторесурс" (чем больше,
тем лучше. Естественно, что в пределах разумного), который позволил бы, в
перспективе, комфортно и с минимальным уровнем "переносогеморроя, поприслонять к
первостраничной матке всяческие нужности".
Примечание: пока, не известно, что именно "прислонять", но в условиях "роЕния в
голове" разнообразнейших мыслей, за этим дело не станет (и еще мало будет).
На 2-й странице памяти программ, проблем с "моторесурсом" нет ("жизненного
пространства" еще много).
Проблемы с ним есть на 1-й странице памяти программ.
При этом следует отметить то, что в нижней "обслуге" 1-й страницы, еще есть ПП,
которые "безгеморройно" можно перенести на 2-ю страницу (например, 3 подпрограммы
записи в EEPROM), но пусть они пока "полежат в заначке" (семейные поймут).
Сие можно расценивать как "хитрый прищур на черный день".
Вот и получается, что настало время для командной оптимизации "устаканившихся" ПП
вычисляемых переходов, в результате которой, можно уменьшить количество команд
текста программы.
При этом, 1-й странице памяти программ "перепадёт больше всего счастья", так как
основная "масса" ПП вычисляемых переходов "дислоцируется" именно на ней.
Ладушки. Так тому и быть.
Вопрос: "Как это дельце провернуть"?
Ответ: см. предыдущий раздел 2-й части "Практикума…", с поправкой на
ЖК-модульную специфику.
Я не просто так в нем "распинался" по поводу всяческих, "табличных оптимизаций", а
c "прикидкой" на будущее.
Вопрос: "Так там шла речь о графических модулях, а в наличии-то ЖК-модуль"?
1
Ответ: в части касающейся вычисляемых переходов, суть одна и та же.
Различаются только детали, и не более того.
Вопрос: "За счет чего, в данном случае, можно уменьшить количество команд, не
добавив при этом ни одной команды"?
Ответ: если рассуждать в общем виде, то за счет обходов дублирующихся
состояний.
И в самом деле, зачем, "после того", подтверждать точно такие же состояния, которые
были выставлены "до того"?
Такого рода подтверждения есть, хотя и не "вредоносное", но достаточно
бестолковое занятие, требующее N-количества таких же бестолковых команд.
И эта бестолковка тем бестолковее, чем большее количество дублирующихся
состояний имеет место быть.
В связи с этим, нудно напоминаю Вам о наличии, в ЖК-модуле, оперативной памяти
данных (показаний).
По смыслу, она точно такая же, как и в графических модулях.
Вопрос: "В данном случае, какие именно дублирующиеся состояния обходить"?
Ответ: вопрос серьезный. Требует объяснения.
Символы могут дублироваться в любых знакоместах той или иной строки дисплея.
В данном же случае, нужно обходить те группы дублирующихся символов, которые
непосредственно "примыкают" к правой и/или левой "границам" той или иной строки.
Символы могут дублироваться и "в далеке" от этих "границ" (например, в середине
надписи), но в этом случае, речь идет уже о компромиссной оптимизации, которая
обеспечивает выигрыш по скорости, но реализация которой требует "дробления
материнской" ПП вычисляемого перехода на несколько "дочерних" ПП вычисляемых
переходов, что есть не уменьшение, а увеличение количества команд.
В данном случае, это не приемлемо.
Вывод: нужно работать только с теми дублирующимися символами, группы которых
(один символ тоже буду считать группой) "примыкают" к правой и/или левой "границам"
той или иной строки, и не более того.
После прочтения "вышележащего", вероятен повышенный уровень "черепномозгового
бардака".
Поэтому, нужно разобраться, сначала, со стратегией, а затем и с тактикой всего этого
"безобразия".
"Разборки" со стратегией.
Например, имеются ПП вычисляемых переходов A, B, C, D, надписи которых, именно
в этом порядке, последовательно выводятся на индикацию в 1-ю строку.
Примечание: порядок вывода надписей на индикацию очень важен! Причем, с
учетом строки.
В простейшем случае (имеются нюансы), надпись ПП вычисляемого перехода А
выводится на индикацию в полном объеме.
То есть, эта ПП не оптимизируется (обходов нет), и она является как бы "матерью"
для ПП вычисляемого перехода B.
Теперь, орлиный взор нужно направить на те группы знакомест ПП вычисляемых
переходов А и B, которые "примыкают" к правой и/или левой "границам" строки.
Если "привязаться" к привычной терминологии, то можно сказать (условно), что ПП
вычисляемого перехода А является, как бы, "мастером" ("ведущим"), а ПП
вычисляемого перехода В является, как бы, "помощником" ("ведомым").
То есть, В сравнивается с А на предмет поиска, в В, тех дублирующихся символов,
которые "примыкают" к правой и/или левой "границам" строки (сравнивается
содержимое знакомест, имеющих одинаковые адреса).
Например.
СЛУШАЮСЬ и à надпись А. Она выводится на индикацию первой и в полном объеме
(обходов нет).
Нагрузка à надпись В. Она выводится на индикацию после надписи СЛУШАЮСЬ и .
Именно ее и нужно "заоптимизировать".
Примечание: все это "безобразие" должно происходить в одной и той же строке
дисплея. "Разнобой" между строками не допустим.
Конкретно, это выглядит так:
1-я строка дисплея (1000 хххх)
2
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111

ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).

TEXT_17 С Л У Ш А Ю С Ь и
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_35 Н а г р у з к а

Здесь и далее, те знакоместа, которые нужно обойти, выделены зеленым цветом, а


те знакоместа, которые не нужно обходить, выделены белым цветом.
В данном случае, и слева, и справа, обнаружено по три совпадения.
Это становится одним из элементов (их может быть много) карты обходов.
В данном случае, совпадают символы "пусто" (часто), но могут совпадать и другие
символы (реже).
Итог: "на стратегическом уровне", надписи A ("мать") и B отработаны.
Далее, то же самое проделывается с надписями B ("мать") и С.
Далее, то же самое проделывается с надписями С ("мать") и D.
И так далее (если имеется бОльшее количество надписей).
В результате такой работы, получается карта обходов.
Примечание 1: при работе со 2-й строкой - стратегия такая же.
Примечание 2: в тех или иных случаях, совпадения могут быть, а могут и не быть.
"Разборки" с тактикой.
Предположим, что имеется готовая карта обходов, в соответствии с которой, в надписи
B ("привязываюсь" к приведенному выше примеру), нужно обойти 3 совпадения слева
и 3 совпадения справа.
Теперь нужно кое-что пояснить.
Ранее, для простоты объяснения, подпрограммами вычисляемых переходов назывались
те группы команд, которые "лежат" в верхних "обслугах" обеих страниц памяти
программ.
Строго говоря, такое толкование не вполне корректно, так как эти группы команд
являются только частью ПП вычисляемых переходов.
В данном случае, подпрограмма вычисляемого перехода состоит из двух частей.
Одна ее часть "лежит в матке" той или иной страницы памяти программ (как бы
"рулевой"), а вторая ее часть (таблица) вынесена в ту или иную верхнюю "обслугу".
Естественно, что обе эти части между собой "плотно взаимодействуют" ("единый
организм, тексторазорванный" на 2 части).
То есть, соответствующие коррективы нужно внести как в одно, так и в другое.
Удобнее начать с таблицы.
Так выглядит "ведущая" таблица (A):

;-----------------------------------
; Надпись " СЛУШАЮСЬ и "
;-----------------------------------
TEXT_17 addwf PC,F ; -----"-----
dt 0x20,0x20,0x20,0x43,0xA7,0xA9,0xAC,0x41
dt 0xB0,0x43,0x62,0x20,0xB8,0x20,0x20,0x20

В ней ничего не обходится (выводится в полном объеме).


Так выглядит "ведомая" таблица (B):

;-----------------------------------
; Надпись " Нагрузка "
;-----------------------------------
TEXT_35 addwf PC,F ; -----"-----
;;; dt 0x20,0x20,0x20,
dt 0x20,0x48,0x61,0xB4,0x70
dt 0x79,0xB7,0xBA,0x61,0x20
;;; dt ,0x20,0x20,0x20

3
"Обходные" команды retlw 20h (символы "пусто") таблицы В просто блокируются
точками с запятыми (выделено серым цветом) по той простой причине, что эти же
символы присутствуют в таблице А, которая была выведена на индикацию ранее.
Я произвел смещение содержимого таблицы таким образом, чтобы обеспечить
удобную, адресную "ориентацию".
Естественно, что на стадии дальнейшего "наведения порядка", заблокированное можно
убрать, а оставшееся скомпановать так, как Вам удобно.
Итак, 6 команд retlw … "отправились к праотцам" (это и есть "локальный", командный
выигрыш. "Меньше народа, больше кислорода").
Теперь, под это дело, нужно скорректировать ту часть ПП вычисляемого перехода,
которая "лежит в матке".
Дележка опытом: лично я, чтобы "не рыскать по всему тексту программы в поисках
рулевого", просто блокирую таблицу (в данном случае, ставится точка с запятой перед
TEXT_35) и после этого произвожу ассемблирование.
Затем, щелчок по сообщению (или сообщениям, если таблица вызывается несколько
раз) об ошибке, и комфортный "выход в сектор обстрела".
После этого, "делаются нужные дела", после чего блокировка снимается.
Особенно это актуально тогда, когда текст программы представляет собой "длиннющую
портянку" (экономится масса времени).
В данном случае, "подрихтованный рулевой" выглядит так:

;================================================================================
; Вывод на индикацию, в 1-ю строку, фиксированной надписи " Нагрузка ".
;================================================================================
movlw b'10000011' ; (было 0000) Установка курсора в 4-е
call ENTER_BF ; знакоместо 1-й строки.
movlw .10 ; (было .16)
movwf Count ;
movf Count,W ;
sublw .10 ; (было .16)
call TEXT_35 ; Аналогично, только
bsf PortC,RS ; для TEXT_35.
call ENTER_BF ;
decfsz Count,F ;
goto $-6 ;
return ; Возврат по стеку.
;================================================================================

Изменения выделены красным цветом.


В этой группе команд, количество команд не увеличилось, а осталось прежним.
Так как первые 3 знакоместа нужно обойти и "прыгнуть" на 4-е, адрес
соответствующим образом корректируется (10000011).
Значения обеих констант вычисляется одинаково и очень просто:
из числа 16 вычитается суммарное количество обходов.
В данном случае, это 16 – (3 + 3) = .10
Вот и вся тактика.
В итоге, "масса" всего этого "безобразия" уменьшилась на 6 команд, и оно
("безобразие"), как работало "до того", так и будет работать "после того".
Помимо этого, по отношению к "матери", эта ПП вычисляемого перехода будет
отрабатываться быстрее.
В данном случае, речь идет о 1-й строке дисплея.
Если же "отрабатывается" 2-я строка дисплея, то все то же самое, только с поправкой
на адресацию к строке (1100хххх) и с учетом карты обходов.
Как видите, если в наличии имеется карта обходов (итог "стратегической" работы), то
в тактике обходов, нет абсолютно ничего сложного. Нужно только внимание.
Основная сложность (трудоемкость) подобного рода работы заключается в составлении
карты обходов.
А раз это так, то сие нужно "капитально провентиллировать".
Что сейчас и будет сделано/показано.
Поехали.

4
Окидываю, сами знаете каким взором, поле битвы.
Да уж … 45 штук ПП вычисляемых переходов это совсем не шутки.
С дуру, по недомыслию или в результате "кавалерийского наскока", запутаться можно
элементарно (проще пареной репы).
Тем не менее, если Вы думаете, что для решения подобного рода задачи нужна
какая-то выдающаяся извилина, то жесточайше ошибаетесь.
Всего-навсего нужна тренированная склонность к упорядочению "черепномозговой
деятельности".
Ну и знание программы/"железяки" тоже. Это само собой.
Сейчас докажу.
Что нужно делать, если "масса" предстоящей работы ужасает/опечаливает?
Правильно. "Разделять и властвовать".
Настоящие "интеллектуальные удавы" именно так и поступают (и правильно делают).
Изначально, имеется такой "расклад":

1-я страница памяти программ


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_1 З А Щ И Т А В Ы К Л Ю Ч Е Н А
TEXT_2 U = в I = а
TEXT_3 П р е в ы ш е н и е U п / I п
TEXT_4 Р Е Ж И М С Л Е Ж Е Н И Я
TEXT_5 П А Р А М Е Т Р Ы З А Щ И Т Ы
TEXT_6 З а д а н и е п о р о г о в
TEXT_7 В к л . | н а г р у з к и
TEXT_8 к н о п к а " + / Д а " .
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_9 В ы х о р о ш о
TEXT_10 п о д у м а л и ?
TEXT_11 О Т К Л . | з а щ и т ы
TEXT_12 к н о п к а " - / Н е т " .
TEXT_14 В К Л . | з а щ и т ы
TEXT_15 П е р е х о ж у в р е ж и м
TEXT_16 С Л Е Ж Е Н И Я
TEXT_17 С Л У Ш А Ю С Ь и
TEXT_18 П О В И Н У Ю С Ь !
TEXT_19 Т е р м о д а т ч и к
TEXT_20 П О Д К Л Ю Ч Е Н
TEXT_21 О Т К Л Ю Ч Е Н
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_30 U в о л ь т и I а м п е р
TEXT_31 т е р м о з а щ и т ы
TEXT_32 Т н = г р . Т в = г р .
TEXT_1_1 З А Щ И Т А В Ы К Л . t =
TEXT_35 Н а г р у з к а
TEXT_36 О Т К Л Ю Ч Е Н А .
TEXT_37 В К Л Ю Ч Е Н А
TEXT_42 П р е в ы ш е н К З п о р о г

2-я страница памяти программ


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.8).
TEXT_22 К а р а у л ! У б и в а ю т !
TEXT_23 х х П Е Р Е Г Р Е В х х
TEXT_24 Ж д и т е п о н и ж е н и я
TEXT_25 т е м п е р а т у р ы
TEXT_26 Т п о р о г а = г р а д .
TEXT_27 Т т е к у щ . = г р а д .
TEXT_28 А в т о м а т и ч е с к а я
TEXT_29 р а з б л о к и р о в к а
TEXT_33 Т т е к у щ . > и л и = Т н .
TEXT_34 В Ы К Л Ю Ч И Т Е Б П ! ! !
TEXT_38 з а щ и т ы о т К З
TEXT_39 В о з в р а т
TEXT_40 и з р е ж и м а
TEXT_41 Т о к К З = , а
TEXT_43 В К Л . О Т К Л .
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.9).
TEXT_44 н о З А Б Л О К И Р О В А Н

5
TEXT_45 в н а с т р о й к а х

Примечание: эти таблицы могут оказаться весьма полезными при "въезде в


ранеетекущенавороченное".
"Мировую революцию" лучше всего начать с "наиболее слабого звена в цепи
империализма" (см. ПСС ВИЛ. Это для тех, кому за 40).
То есть, с того, что в контексте сказанного, нельзя "заоптимизировать".
Прежде всего, речь идет о тех надписях, которые начинаются в 1-м знакоместе и
заканчиваются в 16-м знакоместе:

1-я страница памяти программ


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 111
1
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_1 З А Щ И Т А В Ы К Л Ю Ч Е Н А
TEXT_2 U = в I = а
TEXT_3 П р е в ы ш е н и е U п / I п
TEXT_5 П А Р А М Е Т Р Ы З А Щ И Т Ы
TEXT_6 З а д а н и е п о р о г о в
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_15 П е р е х о ж у в р е ж и м
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_32 Т н = г р . Т в = г р .
TEXT_1_1 З А Щ И Т А В Ы К Л . t = х х
TEXT_42 П р е в ы ш е н К З п о р о г

2-я страница памяти программ


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.8).
TEXT_22 К а р а у л ! У б и в а ю т !
TEXT_23 х х П Е Р Е Г Р Е В х х
TEXT_24 Ж д и т е п о н и ж е н и я
TEXT_25 т е м п е р а т у р ы
TEXT_26 Т п о р о г а = г р а д .
TEXT_27 Т т е к у щ . = г р а д .
TEXT_28 А в т о м а т и ч е с к а я
TEXT_29 р а з б л о к и р о в к а
TEXT_33 Т т е к у щ . > и л и = Т н .
TEXT_34 В Ы К Л Ю Ч И Т Е Б П ! ! !

Такие надписи выделены цветом хаки.


Кроме того, светло-фиолетовым цветом выделены те надписи, которые нужно
вывести на индикацию полностью (результат первой "прикидки").
Пояснения.
1. Так как надписи Караул! Убивают! и хх ПЕРЕГРЕВ хх занимают всю строку, то в
надписях Ждите понижения и температуры обходить нечего.
2. Так как надписи Тпорога= град. и Ттекущ.= град. занимают всю строку, то в
надписях Автоматическая и разблокировка обходить нечего.
3. Так как надписи Ттекущ. > или = Тн. и ВЫКЛЮЧИТЕ БП!!! могут появится в любой
момент, то их нужно вывести полностью.
Уже гораздо легче, так как "сектор обстрела прилично сузился".
После осуществления такого "катаклизма", банально "почесавши за ухом", не
составляет большого труда "упереться" в однозначно могучую (на полном серьезе!)
мысль типа "начинать нужно с самого начала".
Философское примечание: на самом же деле, не все так просто. Некоторыми людьми
эта "могучесть" как-то слабовато ощущается. Наверное потому, что есть проблемы с
эффективной расстановкой приоритетов. Тренироваться нужно (извилину укреплять. Это
главная наша "мышца"). В нашем деле, другого не дано.
Вопрос: "Что является началом всяческих ЖК-дел"?
Ответ: инициализация ЖК-модуля.
Вывод: значит, с нее и нужно начинать "раскрутку цепочки".
Вопрос: "Что является результатом инициализации ЖК-модуля".
Ответ: символы "пусто" (20h. Все точки всех знакомест не "высвечиваются") во всех
знакоместах.

6
Примечание: в графических модулях, результатом инициализации являются "черное
поле" (все наоборот).
Вывод: надписи Термодатчик и ПОДКЛЮЧЕН / ОТКЛЮЧЕН (они выводятся на
индикацию сразу же после инициализации ЖК-модуля) вполне можно "заоптимизировать
на предмет обхода символов "пусто".
В части касающейся этих надписей, получился такой фрагмент карты обходов:

1-я строка дисплея (1000 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_19 Т е р м о д а т ч и к
2-я строка дисплея (1100 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_20 П О Д К Л Ю Ч Е Н
TEXT_21 О Т К Л Ю Ч Е Н

Вопрос: "Почему, не смотря на сказанное выше, надпись Термодатчик выводится на


индикацию полностью"?
Ответ: потому, что она используется 2 раза: после инициализации ЖК-модуля и после
вывода на индикацию этой надписи:

1-я строка дисплея (1000 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_6 З а д а н и е п о р о г о в

Если это проигнорировать сказанное, и в надписи Термодатчик, обойти первые 2 и


последние 3 знакоместа, то в соответствующем пункте меню выбора порогов, будет
"высвечиваться не надпись Термодатчик, а надпись ЗаТермодатчикгов.
То есть, произойдет "накладка" друг на друга надписей Термодатчик и правого/левого
"хвостиков" (выделено красным цветом) надписи Задание порогов.
Вопрос: "Почему так"?
Ответ: потому, что ЖК-модуль имеет оперативную память показаний.
Что касается надписей ПОДКЛЮЧЕН или ОТКЛЮЧЕН, то тут без проблем, так как та
или иная из этих надписей, выводятся на индикацию только один раз (за одно
включение питания).
Только на этом "обведении вокруг пальца", на 1-й странице памяти программ, имеет
место быть выигрыш в 15 команд ("уйдут" в "ефрейторский суперзазорище"), и в
работе программы ничего нарушено не будет.

В случае, если термодатчик электрически подключен, но заблокирован в настройках,


после надписи Термодатчик / ПОДКЛЮЧЕН, на индикацию выводится надпись
но ЗАБЛОКИРОВАН / в настройках.
Надпись но ЗАБЛОКИРОВАН / в настройках выводится на индикацию только один
раз (за одно включение питания).
Следовательно, можно обойти символы "пусто", ранее выведенные на индикацию как в
1-й строке ("до того", имела место быть надпись Термодатчик, выведенная на
индикацию в полном объеме), так и во 2-й строке (в обеих, крайних парах знакомест,
имеют место быть символы "пусто", выведенные на индикацию в результате
инициализации ЖК-модуля).
Соответствующий фрагмент карты обходов выглядит так:

1-я строка дисплея (1000 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.9).
TEXT_44 н о З А Б Л О К И Р О В А Н
2-я строка дисплея (1100 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.9).
TEXT_45 в н а с т р о й к а х

7
Вот Вам и еще выигрыш в 5 команд, но не на 1-й странице памяти программ, а на 2-й.

Прежде чем переходить к оптимизации следующих ПП вычисляемых переходов, нужно


объяснить кое-что весьма существенное (в приложении как к только что сказанному,
так и к тому, что будет сказано ниже).
Для определенности, "привяжусь" к сказанному выше (см. Термодатчик и ПОДКЛЮЧЕН
/ ОТКЛЮЧЕН).
Вопрос: "В каком месте произошло уменьшение количества команд"?
Ответ: в данном случае, во 2-м блоке 1-й страницы памяти программ.
Вопрос: "К чему это приведет"?
Ответ: это приведет к смещению вверх всей группы таблиц подпрограмм вычисляемых
переходов 3-го блока 1-й страницы памяти программ (ну и всего остального
содержимого 1-й страницы. В данном случае, это не существенно).
И это окончится "Гитлер капутом". Причем, на полном серьезе.
Без шуток, ведь будут аж две "бяки":
- верхняя часть содержимого 3-го блока 1-й страницы памяти программ
"передислоцируется" во 2-й блок,
- и "граница" между 2-м и 3-м блоками будет проходить через таблицу.
Голос из-за кулис: "Доигрался, родимый, со своей оптимизацией, до Гитлер капута!!!
Так тебе и надо".
Ответ: спокойствие и еще раз спокойствие. Следствие ведут русские колобки.
На сколько уменьшился объем программы?
В данном случае, на 15 команд.
Значит, для того чтобы "восстановить статус-кво", нужно в конце группы таблиц ПП
вычисляемых переходов 2-го блока, "настучать" 15 "технологических" NOPов, и все
дела.
Посредством этого "кнута", содержимое 3-го блока "загоняется в свой персональный
загон", после чего "цветут ромашки и поют соловьи".
Вопрос: "А что нужно делать, если оптимизация случилась в 3-м или в 1-м блоке"?
Ответ: если оптимизация случилась в 3-м блоке, то в данном случае, ничего делать
не нужно, так как в 4-м блоке, таблиц ПП вычисляемых переходов нет.
Если оптимизация случилась в 1-м блоке, то в данном случае, в конце группы таблиц
ПП вычисляемых переходов 1-го блока, нужно "настучать" количество NOPов равное
количеству "текущеубитых" команд.
Вопрос: "А если оптимизируется не одна, а несколько ПП вычисляемых переходов"?
Ответ: в простейшем случае, это выглядит так
- "заоптимизировали" первую - "настучали" нужное количество NOPов (в нужном месте),
- "заоптимизировали" вторую - "настучали" нужное количество NOPов (в нужном месте),
- "заоптимизировали" третью - "настучали" нужное количество NOPов (в нужном месте),
- и т.д., "до посинения". До тех пор, когда оптимизировать будет нечего.
А можно и "оптом" (при наличии опыта).
В основе всего этого "великолепия", лежит му-принцип "загона стад в свои загоны".
Голос из-за кулис: "Ну и лабуда! NOPов понавтыкал и думаешь, что что-то
заоптимизировал? Какой же ты, после этого, русский колобок - оптимизатор"?
Ответ: еще не все песни спеты. Главная песня впереди.
Предположим, что "заоптимизировано" приличное количество ПП вычисляемых
переходов, и в результате этого, на "стыках" между блоками, принудительно
образовалась группа (группы) совершенно бестолковых NOPов.
Выгоднее всего работать по принципу типа "сверху вниз".
Вектор орлиного взора направляется на группу NOPов, расположенную на "стыке" 1-го
и 2-го блоков 1-й страницы памяти программ.
Подсчитывается количество NOPов.
Например, имеют место быть всё те же 15 штук.
Далее, с целью "плотоядного поиска потенциальной жертвы" (напоминаю про удава. Ну
и орел тоже подойдет. И их гибрид тоже), орлиный взор устремляется в нижнюю
"обслугу" 1-й страницы.
Критерий поиска: "упитанность жертвы" должна быть не менее 15-ти команд.
Более можно, но на немного. В пределах разумного.

8
А то ведь, если чувство меры отказало, можно так сместить содержимое блоков
верхней "обслуги", что "стадА из загонов разбегутся" (в этом случае, "пастуха" нужно
направлять на "курсы повышения квалификации").
Можно выбрать не одну, а несколько "жертв", но при условии, что их суммарная
"упитанность" не будет ниже 15-ти команд.
Если речь идет о достаточно "мощненькой" программе, то обычно, с таким выбором
проблем нет (есть из чего выбрать).
Если не находится подходящего варианта в нижней "обслуге" 1-й страницы памяти
программ, то в крайнем случае, нужно поискать "жертву" в нижней "обслуге" 2-й
страницы.
После того, как "жертва" будет найдена и участь ее предрешена, соответствующая
группа NOPов "убивается", и она ("жертва") перемещается на ее место ("прислоняется
к другой стенке").
В данном случае, если перенос происходит из нижней "обслуги" 1-й страницы, то
никаких дополнительных "телодвижений" делать не нужно: ПП просто "вырезается" из
нижней "обслуги" и "врезается" в соответствующее место верхней "обслуги".
Если перенос происходит из нижней "обслуги" 2-й страницы, то нужно озаботиться
PCLATH-делами.
После "отработки стыка" между 1-м и 2-м блоками 1-й страницы памяти программ,
орлиный взор устремляется на группу NOPов, расположенную на "стыке" 2-го и 3-го
блоков 1-й страницы памяти программ.
Повторяется то же самое.
В данном случае, этого достаточно.
В итоге, все "технологические" NOPы "отправляются к праотцам", а объем программы
уменьшается на то количество команд, которое "убито" в процессе командной
оптимизации.
Примечание: в нижних "обслугах" обеих страниц памяти программ нет ни одной
таблицы (сделано не просто так, а специально). Любую ПП, входящую в состав этих
"обслуг", в пределах страницы, на которой они "лежат", без "заморочек с PCLATH-
делами", можно "засунуть" в различные "места" (естественно, не абы как, а по-умному).
Ниже, я не буду, после каждого "чиха", акцентировать Ваше внимание на только что
сказанном, но общий принцип, сформулированный выше (и связанная с ним
"технология"), по причине своей исключительной важности, никогда не должен
"выпадать из поля Вашего зрения".
В противном случае, будет "Гитлер капут, отягощенный шизофренией".
Сурово, но факт. Мы тут не в бирюльки играем. Дружески предупреждаю.

А теперь вернусь к своим "недожаренным котлетам".


Что там у нас следует после отработки "вышележащего"? "Серия" из трех надписей:
Вы хорошо / подумали?
ОТКЛ. | защиты / кнопка "-/Нет".
ВКЛ. | защиты / кнопка "+/Да".

Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_9 В ы х о р о ш о
TEXT_10 п о д у м а л и ?
TEXT_11 О Т К Л . | з а щ и т ы
TEXT_12 к н о п к а " - / Н е т " .
TEXT_14 В К Л . | з а щ и т ы
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_8 к н о п к а " + / Д а " .

В части касающейся 1-й строки дисплея, получается такой "расклад":

1-я строка дисплея (1000 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_9 В ы х о р о ш о
TEXT_11 О Т К Л . | з а щ и т ы
TEXT_14 В К Л . | з а щ и т ы

9
Из тех надписей, которые выводились в 1-ю строку дисплея "до того", нужно
ориентироваться на самую "массивную".
То есть, "матерью" для надписи Вы хорошо, будет надпись но ЗАБЛОКИРОВАН
Вот Вам и причина наличия всего одного обхода в надписи Вы хорошо.
Далее, надпись Вы хорошо становится "матерью" для надписи ОТКЛ. | защиты , и
далее, надпись ОТКЛ. | защиты становится "матерью" для надписи ВКЛ. | защиты .
Это и объясняет то, что в данном случае, обходы именно такие, а не какие-то другие.
Всего 5 "убитых" команд.
Маловато будет. "Душа вожделеет бОльшего счастья".
"Проворачиваю комбинацию из двух пальцев": ОТКЛ меняю на ВЫКЛ и смещаю
надпись | защиты (в ПП TEXT_14) на одно знакоместо вправо:

1-я строка дисплея (1000 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_9 В ы х о р о ш о
TEXT_11 В Ы К Л . | з а щ и т ы
TEXT_14 В К Л . | з а щ и т ы

Уже гораздо лучше (выигрыш не в 5, а в 15 команд).


Рассуждаю дальше (с "прицелом" на будущее).
К надписи ВЫКЛ. | защиты (1-я строка) "привязана" надпись кнопка "-/Нет". (2-я
строка). Надпись кнопка "-/Нет". Используется 1 раз.
К надписи ВКЛ. | защиты (1-я строка) "привязана" надпись кнопка "+/Да". (2-я строка).
Надпись кнопка "+/Да". Используется 2 раза.
Надпись кнопка "+/Да". нужно вывести на индикацию в полном объеме, так как перед
выводом на индикацию надписи Вкл. | нагрузки / кнопка "+/Да", на индикацию
выводится надпись РЕЖИМ СЛЕЖЕНИЯ / U= , в I= -,- - а (самый неблагоприятный
вариант. 2-я строка "забита под завязку").
Вывод: для того чтобы обеспечить бОльшее количество обходов во 2-й строке
дисплея, нужно изменить порядок вывода на индикацию надписей ВЫКЛ. | защиты /
кнопка "-/Нет". и ВКЛ. | защиты / кнопка "+/Да". (поменять их местами).
В части касающейся 1-й строки, результат этой перестановки выглядит так:

1-я строка дисплея (1000 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_9 В ы х о р о ш о
TEXT_14 В К Л . | з а щ и т ы
TEXT_11 В Ы К Л . | з а щ и т ы

Как видите, в 1-й строке, изменился только порядок вывода надписей на индикацию, а
количество "обойдённых" знакомест осталось прежним (15 штук), но в дальнейшем, при
работе во 2-й строке, такая перестановка даст положительный, "обходной" эффект.
Соответственно, в программе, переставлены местами процедуры вывода на индикацию
надписей ВЫКЛ. | защиты / кнопка "-/Нет". и ВКЛ. | защиты / кнопка "+/Да".
(ничего сложного).
Перехожу "на обстрел" 2-й строки:
В начале сценария-подсказки, в нее выводится надпись подумали?
До нее, во 2-ю строку может быть выведена надпись в настройках (если термодатчик
заблокирован) или надпись ПОВИНУЮСЬ! (при переходе из режима включенной
защиты, в режим выключенной защиты).
Значит, нужно ориентироваться на худший вариант, то есть, на надпись в настройках.
В ней, еще со времён инициализации ЖК-модуля, справа и слева "торчит" по 2
символа "пусто":
2-я строка дисплея (1100 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.9).
TEXT_45 в н а с т р о й к а х

10
Далее следует учесть то, что тот сценарий-подсказка, о котором идет речь, работает
по кольцу.
То есть, с учетом произведенной выше перестановки, надпись подумали? будет
выводиться на индикацию после надписи кнопка "-/Нет".
Получается такой фрагмент карты обходов (надписи следуют в "новом" порядке их
вывода на индикацию):
2-я строка дисплея (1100 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_10 п о д у м а л и ?
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_8 к н о п к а " + / Д а " .
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_12 к н о п к а " - / Н е т " .

Напоминаю, что в соответствии со сказанным выше, надпись кнопка "+/Да". нужно


вывести на индикацию в полном объеме.
Количество "обойденных" знакомест можно увеличить, если исключить, из нижней
надписи, символ "точка".
В целях обеспечения однообразия, исключаю символ "точка" и из таблицы TEXT_8.
Примечание: в данном случае, символ "точка" не несет в себе какой-то уж очень
могучей смысловой нагрузки и его спокойно можно "убить".
Получилось это:
2-я строка дисплея (1100 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_10 п о д у м а л и ?
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_8 к н о п к а " + / Д а "
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_12 к н о п к а " - / Н е т "

В данном случае, имеет место быть выигрыш в 12 команд.


Примечание: вот так, "тихим сапом", "с миру по нитке", и возникает "голому рубаха".
И это еще не вечер.

Перехожу к оптимизации надписей пунктов меню выбора порогов.


Сначала, 1-я строка дисплея:

1-я строка дисплея (1000 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_6 З а д а н и е п о р о г о в
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_19 Т е р м о д а т ч и к
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.8).
TEXT_39 В о з в р а т

Надпись Задание порогов выводится на индикацию полностью (занимает всю строку).


Надпись Термодатчик выводится на индикацию полностью (см. сказанное выше).
Надпись Возврат может выводиться на индикацию как после надписи Термодатчик
(если 4-й пункт меню не обходится), так и после надписи Задание порогов (если 4-й
пункт меню обходится).
Так как нужно ориентироваться на худшее (на надпись Задание порогов), то
получается "полный облом".
В том смысле, что ни одну из этих надписей "заоптимизировать" нельзя.
Если это проигнорировать, и в надписи Возврат, обойти первые 2 и последние 3
знакоместа (ориентация на надпись Термодатчик), то в случае, если 4-й пункт меню
не обходится, будут ладушки, но в случае, если 4-й пункт меню обходится (надпись
Термодатчик на индикацию не выводится), на индикацию будет выведена совершенно
безобразная и просто отвратительная надпись За Возврат гов (особенно гов.
Возбуждает крайне неаппетитные мысли), что в мои планы как-то слабовато
вписывается.

11
Жалко … Но что поделаешь? Такова жизнь-злодейка (в данном случае. Не всё коту
масленница).
"Не солоно хлебавши", перехожу во 2-ю строку.

2-я строка дисплея (1100 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_30 U в о л ь т и I а м п е р
TEXT_31 т е р м о з а щ и т ы
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.8).
TEXT_38 з а щ и т ы о т К З
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.8).
TEXT_43 В К Л В Ы К Л
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.8).
TEXT_40 и з р е ж и м а

Последнее знакоместо надписи Uвольт и Iампер обходить нельзя, так как перед ней,
возможно наличие надписи U= , в I= , а, которая занимает всю строку.
В соответствии с обозначенным выше "стандартом", оба символа "точка" заменены на
символы "пусто" (выигрыш в 2 обхода), и ОТКЛ заменено на ВЫКЛ (для обеспечения
единообразия с "вышележащим").
Надпись из режима ориентирована на наихудший "расклад" (отрабатывается 4-й пункт
меню. То есть, на надпись ВКЛ ВЫКЛ).
Худо-бедно, а еще 9 обходов "по сусекам нашкрябал".
Итак, надписи пунктов меню установки порогов отработаны.

Теперь нужно "ветвиться".


В том смысле, что нужно "заоптимизировать" те надписи, которые "высвечиваются", во
2-й строке, после отжатия, во время "высвечивания" надписи того или иного пункта
меню, кнопки "Установка порогов".

1. Если отжать кнопку "Установка порогов" во время "высвечивания" надписи Задание


порогов / Uвольт и Iампер, то во 2-й строке "высветится" надпись U= . в I= . а
(вместо одного из символов "=", будет маркер), которая занимает всю строку.
Вывод: "облом". "Счастья" нет.
2. Если отжать кнопку "Установка порогов" во время "высвечивания" надписи
Термодатчик / ВКЛ ВЫКЛ, то надпись 2-й строки не изменится (останется "старой").
Только появится маркер, который, "как кот, гуляет сам по себе" (как бы "отдельная
жизнь")
Вывод: "облом". По причине того, что оптимизировать просто нечего.
3. Если отжать кнопку "Установка порогов" во время "высвечивания" надписи Задание
порогов / термозащиты, то во 2-й строке "высветится" надпись Тн= гр. Тв= гр.
(вместо одного из символов "=", будет маркер), которая занимает всю строку.
Вывод: "облом". "Счастья" нет. Но оно (правда "дохловатое") возможно. Если убрать
символы "точка".
2-я строка дисплея (1100 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_31 т е р м о з а щ и т ы
TEXT_32 Т н = г р Т в = г р

Убираю.
В этом случае, в надписи Тн= гр Тв= гр, можно обойти последнее знакоместо.
"С паршивой овцы, хоть шерсти клок".

4. Если отжать кнопку "Установка порогов" во время "высвечивания" надписи Задание


порогов / защиты от КЗ, то во 2-й строке "высветится" надпись Ток КЗ = , а

2-я строка дисплея (1100 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.8).
TEXT_38 з а щ и т ы о т К З
TEXT_41 Т о к К З = , а
12
Это уже "пожирнее".
В том смысле, что в процессе вывода на индикацию надписи Ток КЗ = , а, можно
обойти 4 знакоместа.
Ну и ладушки.
Этот "сектор обстрела отработан". Перехожу в следующий.

Теперь нужно как следует "помучать" надписи Нагрузка / ВКЛЮЧЕНА и Нагрузка /


ОТКЛЮЧЕНА.
Для обеспечения единообразия (в данном случае, это не "осчастливливает" одним
обходом), сразу заменяю надпись ОТКЛЮЧЕНА на надпись ВЫКЛЮЧЕНА.
Обращаю Ваше внимание на то, что надпись Нагрузка / ВКЛЮЧЕНА или надпись
Нагрузка / ВЫКЛЮЧЕНА, "высвечивается" только после надписи СЛУШАЮСЬ и /
ПОВИНУЮСЬ!
Отрабатываю 1-ю строку.
1-я строка дисплея (1000 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_17 С Л У Ш А Ю С Ь и
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_35 Н а г р у з к а

Надпись СЛУШАЮСЬ и нужно вывести на индикацию в полном объеме, так как эта
надпись может быть "вызвана" в любой момент.
В том числе и во время отработки надписи, занимающей всю строку.
Ну а с надписью нагрузка должно быть все понятно, так как она "высвечивается"
только после надписи СЛУШАЮСЬ и .
Вот Вам и еще 6 "обойденных" знакомест.
Перехожу во 2-ю строку.
Надпись ПОВИНУЮСЬ! нужно вывести на индикацию в полном объеме, так как эта
надпись может быть "вызвана" в любой момент.
В том числе и во время отработки надписи, занимающей всю строку.
Короче, такая же "петрушка", что и с надписью СЛУШАЮСЬ и .

2-я строка дисплея (1100 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_18 П О В И Н У Ю С Ь !
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_36 В Ы К Л Ю Ч Е Н А
TEXT_37 В К Л Ю Ч Е Н А

Так как надписи ПП TEXT_36 и TEXT_37 выводятся на индикацию только после


надписи ПОВИНУЮСЬ! , то понятийных проблем с теми обходами, которые Вы видите,
быть не должно.
Символ "точка", который завершает надпись ВЫКЛЮЧЕНА , я убрал, как "инородное
тело".
К тому же, после надписи ВЫКЛЮЧЕНА , точки нет.
В свое время, я ее "поставил для симметрии".
Почему, в одной из надписей, нельзя обойти дублирующуюся группу знакомест
КЛЮЧЕНА ?
Потому, что надписи ВЫКЛЮЧЕНА и ВКЛЮЧЕНА выводятся на индикацию не
последовательно, а по принципу типа "ИЛИ" ("или то, или сё").
А раз это так, то я сдвинул надпись ВЫКЛЮЧЕНА на одно знакоместо вправо.
Получилось это:
2-я строка дисплея (1100 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_18 П О В И Н У Ю С Ь !
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_36 В Ы К Л Ю Ч Е Н А
TEXT_37 В К Л Ю Ч Е Н А

13
Так оно, на мой взгляд, более симпатично смотрится (первые буквы надписей
Нагрузка и ВЫКЛЮЧЕНА / ВКЛЮЧЕНА находятся "на одной вертикальной линии").
Вот Вам и еще 12 "обойденных" знакомест.

Ну а теперь, можно "подработать мелочи".


Надпись РЕЖИМ СЛЕЖЕНИЯ должна выводиться на индикацию в полном объеме, так
как перед ней имеет место быть надпись Перехожу в режим , которая занимает всю
строку.
После надписи РЕЖИМ СЛЕЖЕНИЯ , всегда выводится надпись Вкл. | нагрузки :

1-я строка дисплея (1000 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_4 Р Е Ж И М С Л Е Ж Е Н И Я
TEXT_7 В к л . | н а г р у з к и

"Дохловато" как-то получается.


Убираю точку и смещаю | нагрузки влево на одно знакоместо:

1-я строка дисплея (1000 хххх)


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_4 Р Е Ж И М С Л Е Ж Е Н И Я
TEXT_7 В к л | н а г р у з к и

Это конечно не "Рио-де-Жанейро", но лучше чем было. Аж в целых 2 раза.


Мелочь, а на душе приятно.

Следующая "мелочь".
Надпись ЗАЩИТА ВЫКЛ. t = всегда выводится после надписи СЛУШАЮСЬ и
(последнее выводится в полном объеме).
Получается так:
1-я строка дисплея (1000 хххх)
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_17 С Л У Ш А Ю С Ь и
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_1_1 З А Щ И Т А В Ы К Л . t =

Последние 2 знакоместа можно обойти не столько по причине дублирования состояний,


сколько по причине того, что в них выводятся текущие значения температуры.
Эта термокошка гуляет сама по себе.
Перед тем, как она откроет рот, ей вообще наплевать на то, что именно установлено
в этих знакоместах, но после того, как она его откроет, в эти знакоместа будут
вставлены текущие мяу.
Возможны различные вариации. Вплоть до жизнесберегающего, омерзительного вопля.
Количество децибелов и уровень омерзительности зависит от степени ущемления
хвоста.
Это на тот случай, если бандиты будут откровенно ломиться в квартиру: удар
молотком по хвосту (не беспокойтесь, кошки очень живучие), душераздирающий вопль,
бандиты пугаются/ужасаются и позорно убегают.
Шутка-прибаутка-прикол или что-то посерьезнее?
А это зависит от того, с какого бока глянуть.
Надеюсь, что Вы глянете с нужного бока.

Следующая "мелочь".
Надпись СЛЕЖЕНИЯ всегда выводится после надписи ПОВИНУЮСЬ! (последнее
выводится в полном объеме).
Получается так:
2-я строка дисплея (1100 хххх)
14
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 111
1

ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).

TEXT_18 П О В И Н У Ю С Ь !
TEXT_16 С Л Е Ж Е Н И Я

Тут и комментировать-то нечего.

Теперь все это "добро собирается до одной кучи" и составляется карта обходов:

Карта обходов
1-я страница памяти программ
Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.0).
TEXT_1 З А Щ И Т А В Ы К Л Ю Ч Е Н А
TEXT_2 U = в I = а
TEXT_3 П р е в ы ш е н и е U п / I п
TEXT_4 Р Е Ж И М С Л Е Ж Е Н И Я
TEXT_5 П А Р А М Е Т Р Ы З А Щ И Т Ы
TEXT_6 З а д а н и е п о р о г о в
TEXT_7 В к л | н а г р у з к и
TEXT_8 к н о п к а " + / Д а "
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.1).
TEXT_9 В ы х о р о ш о
TEXT_10 п о д у м а л и ?
TEXT_11 В Ы К Л . | з а щ и т ы
TEXT_12 к н о п к а " - / Н е т "
TEXT_14 В К Л . | з а щ и т ы
TEXT_15 П е р е х о ж у в р е ж и м
TEXT_16 С Л Е Ж Е Н И Я
TEXT_17 С Л У Ш А Ю С Ь и
TEXT_18 П О В И Н У Ю С Ь !
TEXT_19 Т е р м о д а т ч и к
TEXT_20 П О Д К Л Ю Ч Е Н
TEXT_21 О Т К Л Ю Ч Е Н
ВЕРХНЯЯ "ОБСЛУГА" 1-й СТРАНИЦЫ (3-й блок памяти программ / PCLATH=.2).
TEXT_30 U в о л ь т и I а м п е р
TEXT_31 т е р м о з а щ и т ы
TEXT_32 Т н = г р Т в = г р
TEXT_1_1 З А Щ И Т А В Ы К Л . t =
TEXT_35 Н а г р у з к а
TEXT_36 В Ы К Л Ю Ч Е Н А
TEXT_37 В К Л Ю Ч Е Н А
TEXT_42 П р е в ы ш е н К З п о р о г

2-я страница памяти программ


Адресà 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (1-й блок памяти программ / PCLATH=.8).
TEXT_22 К а р а у л ! У б и в а ю т !
TEXT_23 х х П Е Р Е Г Р Е В х х
TEXT_24 Ж д и т е п о н и ж е н и я
TEXT_25 т е м п е р а т у р ы
TEXT_26 Т п о р о г а = г р а д .
TEXT_27 Т т е к у щ . = г р а д .
TEXT_28 А в т о м а т и ч е с к а я
TEXT_29 р а з б л о к и р о в к а
TEXT_33 Т т е к у щ . > и л и = Т н .
TEXT_34 В Ы К Л Ю Ч И Т Е Б П ! ! !
TEXT_38 з а щ и т ы о т К З
TEXT_39 В о з в р а т
TEXT_40 и з р е ж и м а
TEXT_41 Т о к К З = , а
TEXT_43 В К Л В Ы К Л
ВЕРХНЯЯ "ОБСЛУГА" 2-й СТРАНИЦЫ (2-й блок памяти программ / PCLATH=.9).
TEXT_44 н о З А Б Л О К И Р О В А Н
TEXT_45 в н а с т р о й к а х

Как видите, на ней четко видно, что именно нужно обходить.

15
Далее, в соответствии с "вышележащей", немудреной методикой, эти самые обходы и
осуществляются.
Программа, в которой это реализовано, называется BP_15.asm (прилагается).
По сравнению с предыдущей программой BP_14.asm, в программе BP_15.asm, меньшее
количество команд, а "масса ефрейторского суперзазорища" возросла, с 12 ячеек PC,
до 83-х, что внушает огромный оптимизм (в части касающейся "детородных функций
матки").
Визуально, в работе "железяки" практически ничего не изменилось.
Естественно, что скорость отработки "заоптимизированных" циклов увеличилась, но это
не сильно ощущается, так основная "масса" этих циклов определяется теми
задержками, которые "не тронуты".
Если в этом есть необходимость, то время отработки этих циклов можно
подкорректировать.
Может быть и подкорректитую. Позднее. Если захочется.
Короче, как в песне поется, "а помирать нам рановато, есть еще у нас дома дела".
org 801h заменил на org 800h. Зачем добру пропадать?

То, что Вы только что прочитали, а также и итог всей текущей работы, есть типичный
пример "симбиоза чистого ассемблера и биокомпьютера".
Попробуйте сделать то же самое с упованием на какой-нибудь язык высокого уровня и
всяческие "бесплатные Виндосыры", и Вы проклянете все на свете.
Особенно тогда, когда речь идет об оптимизации.
Может быть даже и получится, но трудозатраты будут такими высокими, что в
конечном итоге, это "вождение носом по батарее" неумолимо приведет к осознанию
необходимости такого "симбиоза".
Естественно, что это утверждение справедливо только тогда, когда речь идет не о
халтуре.
А если речь идет о ней, то и Запорожец сойдет.
Тарахтит, дымит, воняет, вибрирует, бензин/масло безмерно кушает, но ведь едет!
В "стародавние времена", у меня был Запорожец.
"Ушастый" (высший, экстремальный пилотаж!).
Польстился (умишко-то был совсем плохой). Купил за "рубль" (вот где "корень зла"!).
И он, с учетом моих сверхтитанических усилий, даже ездил (иногда).
Сколько он из меня "крови попил"…
"То понос, то золотуха", то вообще черт знает что (идентификации не поддается).
Я из-под него не вылезал.
И даже руки не отмывались. И сны снились какие-то чуднЫе.
А сколько бензина/масла "сожрал"…
Когда я от него избавился и купил потрепанный "Жигуль" (тоже не подарок, но гораздо
лучше), это был истинный праздник души.
А вообще-то, по большому счету, я ему благодарен, так как он реально помог понять,
как именно "закаляется сталь".
"Сказка - ложь, но в ней намек. Добрым мОлодцам урок".
Примечание: в данном случае, никакой сказки и никакой лжи нет.
Выводы делайте сами.

16
"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru

17