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

2-1/8.

"Учебно-тренировочная" оптимизация кодов сценариев №№ 1 ("УПАСТЬ…)


и 2 ("ОТЖАТЬСЯ…"), с "упором" на обеспечение максимальной скорости их
отработки (или "сколачивание коллектива").

Вопрос: "Что востребовано по логике здравого смысла"?


Ответ: то, что связано с основной "массой жизни".
Пояснение: неделя жизни это сущая ерунда по сравнению с остальной ее
продолжительностью, но и неделю жизни сбрасывать со счетов нельзя, так как за это
короткое время можно основательно поднабраться ума-разума, после чего можно не
опасаться "бяк", связанных с реализацией всем известной концепции типа "жизнь нужно
прожить так, чтобы не было мучительно больно за бесцельно прожитые годы".
А никто и не сбрасывает.
Поэтому, в настоящее время, русские колобки представляют собой умудренные опытом,
хитрющие и коварные организмы, которые, с упорством маньяка, целенаправленно
катятся в сторону компромиссной оптимизации кодов сценариев №№1 и 2.
Вопрос: "Чем это отличается от того, что было проделано ранее"?
Ответ: по сути, практически ничем. Только числовыми значениями байтов данных,
которые нужно обойти.
Вопрос: "Что конкретно нужно обойти"?
Ответ: если особо не вдаваться в специфику, то нужно обойти
- байты данных, которые подтверждают ранее установленные состояния
(вне зависимости от их числовых значений),
- и байты данных фиксированных элементов картинки, которые "убивать" (записью
"по верху") нельзя.
Вопрос: "От чего и куда плясать"?
Ответ: от кода картинки 1-го "кадра", в сторону дальнейшего развития событий.
В смысле, "куда кривая (логика) выведет".
Компромиссная оптимизация кода картинки 1-го "кадра" была произведена ранее.
В целях обеспечения максимальной концентрации внимания на предмете разговора и
уменьшения длины "программной портянки", в данном случае, я не буду компромиссно
оптимизировать код картинки 1-го "кадра".
Но можно и "заоптимизировать". Нет проблем. Нужно только, в "предмете пытки",
заменить соответствующие "незаоптимизированные куски" программы на
"заоптимизированные" (см. предыдущий подраздел), не забыв, после этого, с целью
"жизнеутверждающего убийства возможных прыжковых бяк", "прощелкать" все
сообщения Message[306].
В условиях наличия 3-х достаточно "крутых сюжетов" (а может быть и больше, и они
могут быть еще "круче"), дальнейшая работа должна производиться не абы как, а по
определенной методике.
Если "все свалить в одну общую кучу" и пытаться ее "ковырять", то в большинстве
случаев, ничего кроме "геморроя" не получится.
Хотя, "гигантам мысли" это не грозит.
А так как достаточно велика вероятность того, что среди нас, таковых не много
(пояснение: я не причисляю себя к "гигантам мысли"), то есть немалый смысл в
использовании спасительного принципа "разделяй и властвуй".
Любая методика, построенная по принципу "разделяй и властвуй", есть некий "набор"
последовательных "шагов" (этапов работы).
Цель работы - составление "чистовиков карт обходов" 1-го и 2-го сценариев.
В данном случае, дальнейшую работу выгодно "раздробить" на следующие этапы:

1. По результату сравнения кодов 1-го "кадра" и 1-го сценария,


составляется "черновик карты обходов" 1-го сценария.
2. По результату сравнения "черновика карты обходов" 1-го сценария и кода
2-го сценария, составляется "чистовик карты обходов" 1-го сценария.
3. По результату сравнения "чистовика карты обходов" 1-го сценария и кода
2-го сценария, составляется "чистовик карты обходов" 2-го сценария.
4. Составление сводного "чистовика карты обходов" 1-го и 2-го сценариев.

1
1. Составление "черновика карты обходов" 1-го сценария.

По большому счету, речь идет о решении достаточно тривиальной задачи: код


страницы 1-го "кадра" побайтно сравнивается с кодом той же страницы 1-го сценария.
Сравниваются те числовые значения байтов, которые имеют одинаковые адреса.
Если числовые значения пары сравниваемых байтов различны, то делается вывод о
том, что соответствующий байт кода 1-го сценария на индикацию вывести нужно
("друг").
Если числовые значения сравниваемых байтов одинаковы, то их нужно как-то пометить
(потенциальный "враг", и не более того!).
Я применил выделение ярко-желтым цветом, но можно и по-другому.
Короче, всех "подозреваемых" нужно "доставить в прокуратуру" для последующего
разбирательства.
При этом следует учесть то, что речь идет именно о "подозреваемых", вина которых
еще не доказана (презумпция невиновности - превыше всего!).
Не исключено, что перед некоторыми "подозреваемыми" придется извиняться и
конфетку им давать (какая-никакая, а компенсация за моральный ущерб).
Вывод: хлеб работников прокуратуры тяжек.
Но он - с маслом и икоркой. Можно и потерпеть.
По поводу числовых значений "подозреваемых": они могут быть любыми (естественно,
что в пределах байта). Важно только их числовое совпадение.
Начинаю с 1-го кристалла:

2
Как видите, совпадают только байты с нулевыми значениями, но это вовсе не
свидетельствует о том, что совпадений байтов с другими числовыми значениями не
может быть.
Они вполне могут быть, но только не в данном случае.
Объяснение этому очень простое: нерациональное "ваяние" элементов картинок
(прискорбно сообщаю, что это делалось "от балды").
Из этого следует практический вывод: если "ваять" элементы картинок с
"дальним прицелом" на максимальную эффективность последующей,
компромиссной оптимизации, то "ваять" их нужно так, чтобы в том, что
будет записываться "по верху", имело место быть как можно большее
количество побайтных подтверждений ранее установленных состояний.
В случае, если "обходных" массивов будет не много, но они будут "упитанными"
("жирными"), будет наблюдаться "компромисснооптимизированное счастье".
Но если буквально следовать такой прямолинейной логике, то можно вообще прийти к
"маразму" типа "в 1-м кадре - все нули, а в следующем сценарии, на индикацию
выводится один байт".
На кой ляд и эти нули, и это однобайтное убожество нужны?
Курам на смех.
Банальный вывод: любая крайность вредна. Истина находится где-то посередине.
Еще один вывод (философский): не все так просто в этой бренной жизни.
Компромисс это не "хухры-мухры", а "продукт жизнедеятельности качественного, да к
тому же еще и ХОЗЯЙСКОГО, мозга".
Максимальная выгода (в соответствии с данностью) это как раз и есть тот самый
"продукт".
Причем, с учетом "жизненной теории относительности".
К примеру, "консенсус" между Васей и Петей вовсе не означает "консенсуса" между
Петей и Иваном.
Чтобы Петя был в "консенсусе" и с Васей, и с Иваном, Петя должен, например,
учесть, что Вася любит кошек, а Иван их терпеть не может (и т.д., и т.п.)
При работе с графическими модулями (и вообще со всем тем, что обладает
оперативной памятью), это ощущается с особой и убедительной силой.
Вернусь к своим "котлетам".
Итак, на первый взгляд, все просто до безобразия: при работе с 1-м кристаллом, в
части касающейся компромиссной оптимизации кода картинки 1-го сценария
("УПАСТЬ…"), нужно просто обойти все массивы "нулевых" байтов, которые,
на рис. 1 и 2, выделены ярко-желтым цветом.
"Спасать от уничтожения" ничего не нужно.
Обращаю Ваше внимание на то, что этот вывод не является окончательным.
Вопрос: "Почему"?
Ответ: потому, что кроме 1-го сценария, существует и 2-й, и во 2-м сценарии, в
секторах, выделенных ярко-желтым цветом, на индикацию могут выводиться байты, с
числовыми значениями отличными от тех, которые обходятся в 1-м сценарии.
Если, при компромиссной оптимизации картинки 1-го сценария, эти байты бездумно
обойти, то в картинке 1-го сценария (после смены картинки 2-го сценария на картинку
1-го сценария) будут присутствовать "совершенно безобразные и отвратительные
кракозябры", представляющие собой "обрывки" кодов картинки 2-го сценария
(напоминаю про оперативную память графического модуля).
Это как раз тот пренеприятнейший, но наисправедливейший случай, когда перед
"подозреваемыми" нужно извиниться и отпустить их на все 4 стороны (и еще "в щечку
поцеловать", чтобы не возмущались).
Пускай "функциклируют" на благо общего дела, а иначе, хлопот не оберешься.
Вывод: не все так просто в "Датском королевстве".
Имеют место быть достаточно сложные взаимоотношения между Петей, Васей и
Иваном.
А что есть Петя, Вася и Иван?
Это есть коллектив.
И если взаимоотношения членов коллектива не будут урегулированы, то будет не
коллектив, решающий общую задачу, а одно недоразумение.
Ладно. Посмотрим, что из этого получится.
3
А пока перехожу на 2-й кристалл.
Здесь уже сложнее, так как и боеголовку, в "комплекте" с нижней половиной солнца,
нужно обойти, и динамические элементы картинки имеют место быть.
Сначала сравниваю вторые страницы 1-го "кадра" и 1-го сценария.

"Желтизны" предостаточно.
Красными рамками выделены все, имеющиеся в наличии, "птички".
Ярко-желтым цветом выделены повторяющиеся байты.
Светло-желтым цветом выделен массив байтов, который "убивать" нельзя (нижняя
половина солнца) и который однозначно нужно обойти.

Теперь перехожу на третьи страницы 1-го "кадра" и 1-го сценария.

Выделения - те же самые, только "птичек" не три, а две, и от "уничтожения


спасается" боеголовка.
Обратите внимание на то, что выделено красной рамкой, но не выделено ярко-
желтым цветом.
Этот частичный, числовой "разнобой" объясняется наличием стрелки, которая, в
картинке 1-го "кадра", указывает на левую "птичку".
А в 1-м сценарии, ее нет ("убийство" стрелки записью нулей "по ее верху").
4
Вот и получается числовой "разнобой".
Теперь можно составить "черновик карты обходов" 1-го сценария.
Для удобства, я наложил картинку 1-го сценария на картинку 1-го "кадра" (в части
касающейся вторых и третьих страниц графического модуля).
Получилось сие "творение":

А это и есть "черновик карты обходов" 1-го сценария:

Ярко-желтым цветом выделены "подозреваемые".


В том числе и те, перед которыми, далее, придется извиняться.

2. Составление "чистовика карты обходов" 1-го сценария

Теперь нужно "сваять "чистовик карты обходов" 1-го сценария.


"Чистовик карты обходов" 1-го сценария есть "продукт любви" ("карапуз") между
"черновиком карты обходов" 1-го сценария и кодом картинки 2-го сценария, в части
касающейся тех массивов байтов, которые, на рис. 6, выделены ярко-желтым цветом.
Для обеспечения "прошибаемости", работаю "покристалльно".

Сначала, произвожу "усушку-утруску" в 1-м кристалле:

5
Вопрос: "Что означает красное выделение"?
Ответ: красное выделение есть аннулированная часть ярко-желтого выделения
рисунка 6. Это те "подозреваемые", перед которыми нужно извиниться.
Вопрос: "Почему часть обходных байтов аннулирована"?
Ответ: потому, что существует числовой "разнобой" со 2-м сценарием (пары чисел не
одинаковы).
Если, в 1-м сценарии, обойти то что выделено красным цветом, то начиная с 4-го
полного цикла программы (1-й цикл - вывод 1-го "кадра", 2-й цикл - вывод картинки
1-го сценария, 3-й цикл - вывод картинки 2-го сценария) и далее, в картинке 1-го
сценария, будут иметь место быть упомянутые выше "кракозябры" ("обрывки" кодов
картинки 2-го сценария).
Вот так и "родился" "чистовик карты обходов" 1-го сценария, в части касающейся 1-го
кристалла:

Для наглядности, ниже этого "чистовика", я поместил картинку, в которой надпись 2-го
сценария наложена на надпись 1-го сценария.
После "вгрызания в ее сермяжную суть", вернее всего, возникнет вопрос: "Почему не
обходятся массивы нулевых байтов (они есть), расположенные правее"?
Ответ: потому, что 1-й сценарий должен "жить душа в душу" и с 1-м "кадром", и со
2-м сценарием, а иначе - "кракозябры".
Проще говоря, речь идет о совпадениях числовых значений "одноадрессных" байтов
кодов картинок 1-го "кадра", 1-го и 2-го сценариев (в "комплексе").
Ну ничего, отыграюсь на 2-м сценарии, так как в этом случае проще: 2-й сценарий
должен "жить душа в душу" только с 1-м сценарием (1-й "кадр" - "по барабану").

Теперь произвожу "усушку-утруску" во 2-м кристалле:

6
Принцип выделения красным цветом - тот же самый: разница числовых значений
"одноадресных" байтов 1-го и 2-го сценариев.
Вот так и "родился" "чистовик карты обходов" 1-го сценария, в части касающейся 2-го
кристалла:

Теперь "прислоняю" одну картинку к другой, в результате чего получился "чистовик


карты обхода" 1-го сценария:

7
Особенность этой "карты обходов" заключается в том, что массивы байтов,
выделенные ярко-желтым цветом, за исключением массивов байтов боеголовки и
нижней половины солнца, повторяются в трех кодах:

- в коде картинки 1-го "кадра",


- в коде картинки 1-го сценария,
- в коде картинки 2-го сценария.

А так и должно быть, так как 1-й сценарий находится в "окружении" 1-го "кадра" и
2-го сценария, и для обеспечения полного отсутствия "кракозябр", нужен "могучий
консенсус" (это камень в огород инициатора перестройки) типа "сам живи и другим
жить не мешай".
Если этой "триединой любви" не состоится (будет обойдено то, что не повторяется во
всех 3-х случаях), то на индикацию, из-за наличия в графическом модуле оперативной
памяти данных, будет выведена часть "продуктов предыдущей жизнедеятельности",
которые конструктору нужны так же, как козе баян и зайцу лыжи.
Так как, в данном случае, речь идет о компромиссной оптимизации без каких бы то ни
было поблажек и отклонений от "материнской линии" (по визуальному восприятию
содержимого дисплея - точное повторение "матери"), то и "триединая любовь"
обязательно должна иметь место быть.
А если ее нет, то нужно "обрушить на голову врага" супермудрое армейское
изречение: "Не хочешь - заставим, не можешь - научим".
А заодно и подкрепить его делом.
Только так, а никак иначе. А иначе - "Гитлер капут".
Ну ладно, это лирика. Нечего "панику разводить".
Пока никакого "Гитлер капута" не прослеживается.
Прослеживается вполне реальный и милый сердцу "чистовик карты обходов" 1-го
сценария (см. рис. 14).

Теперь нужно "состряпать" "чистовик карты обходов" 2-го сценария.


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

8
3. Составление "чистовика карты обходов" 2-го сценария

Принцип работы - тот же самый: отыскиваются и метятся "одноадресные" байты.


Светло-желтым цветом выделены элементы "чистовика карты обходов" 1-го сценария.
Зеленым цветом выделены дополнительные совпадения.

9
Теперь можно составить "чистовик карты обходов" 2-го сценария:

Рис. 19 удобен тем, что на нем четко видны те дополнительные (по отношению к
"чистовику карты обходов" 1-го сценария) массивы байтов, которые можно, во 2-м
сценарии, "безбяково" обойти.
Они выделены зеленым цветом.
Но для дальнейшей работы, более пригоден такой вариант "чистовика карты
обходов" 2-го сценария:

4. Составление сводного "чистовика карты обходов" 1-го и 2-го сценариев

Теперь можно "собрать все до кучи", то есть, "сваять" сводный "чистовик карты
обходов" 1-го и 2-го сценариев, а затем "довести его до ума" в том смысле, чтобы он
был удобен в дальнейшей работе.
Первая часть этой задачи решается так:

10
В принципе, все "обходные" массивы можно было бы "закрасить" одним и тем же
цветом, но изначально, все-таки есть смысл сконцентрировать внимание на
принадлежности этих массивов к тому или иному сценарию и на способах обходов.

Ярко-желтым цветом выделены те массивы, которые обходятся в 1-м сценарии.


Зеленым цветом выделены те массивы, которые обходятся во 2-м сценарии.
Черным цветом выделены те массивы, которые "контачат" с "границами"
страниц графического модуля и которые можно обойти без дроблений
(с помощью инструкций Set Page или Set Address).

Вот что получилось в конечном итоге:

Красные цифры это номера байтов, которые обходятся.

Программа, в которой реализованы эти обходы, называется 12864_5.asm (прилагается).


Она работает в "железе". Можете убедиться.
В этой программе, для обеспечения комфортной, адресной "навигации" по таблицам, я
не стал сдвигать байты влево, а сохранил их табличные "координаты".
Те байты, которые обходятся, заблокированы (выделены) точками с запятыми.
Особое внимание обратите на адресацию к первому байту "подмасива" и на
назначение количества байтов в "подмассиве".
"Мать" этой программы - программа 12864_2.asm.
На "высоких скоростях махания крыльями", программа 12864_5.asm, по качеству
картинки, будет наиболее выигрышна, так как, при прочих, равных условиях, жидкие
кристаллы успеют повернуться на больший угол.
11
Но по большому счету, даже и не в этом дело, ведь во многих случаях, высокая
скорость динамики не требуется и можно использовать "сплошное" заполнение.
А дело в том, что на этом примере, я попытался показать "кухню" работы с большими
массивами табличных данных, "конструкция" которых далеко не всегда рациональна.
Особенно тогда, когда эти массивы "ваялись от балды" (как в данном случае).
А вот если изначально (то есть, после "полного цикла вождения носом по батарее")
знать, за какую именно "сиську нужно дернуть" (это я про "корову, которая молоко
дает"), то к примеру, та же самая картинка (или ее элемент) будет "ваяться" не абы
как, и "место ее дислокации" будет выбираться по такому же принципу.
Для этого, в том или ином табличном, вычисляемом переходе, на уровне сознания и
подсознания, нужно увидеть то, что в нем "замаскировалось".
Глубокое понимание этой темы будет иметь место быть тогда, когда человек сможет
"отчитаться" за каждую цифирку того или иного массива байтов: почему она именно
такая, а не другая, почему она "залегла" именно в этом "месте", а не в другом и т.д.?
И именно в этом "въедливом" контексте, я затеял разговор о
дроблениях/обходах/компромиссной оптимизации.
На мой взгляд, в "первичнопонятийном" отношении, такой разговор нужен, и я надеюсь
на то, что коллективными усилиями, мы разберемся с тем, что есть рационально, а
что есть нерационально.
Как из нерационального сделать рациональное - отдельный и большой (даже
огромный) разговор, но для начала, как минимум, нужно составить представление о
том "что такое хорошо и что такое плохо", а заодно и как следует прочувствовать
работу с большим количеством "не хилых" табличных переходов, "разбросанных от
Калининграда до Владивостока".
Обращаю Ваше внимание на то, что мы находимся в "епархии" больших и "серьезных"
массивов данных.
Их размещение в памяти программ ПИКа выигрышно, так как это позволяет обойтись
без использования внешней памяти программ.
Сие сулит большое "счастье", а заодно и большую работу, так как тема совсем не
слаба.

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

12

Оценить