Экскурс в анатомию ZX
(С) DICTATOR
_______________________________
Пролог.
"А подать сюда этого
Тяпкина-Ляпкина!"
Реакция читателей на цикл
"Ассемблер для чайников" была
настолько обширной и неожидан-
ной, что повергла нас в глубокие
раздумья о бренности всего суще-
го. По большому счету,все откли-
ки можно разделить на два типа:
"Это что - злобный прикол?" и
"мы не кухонная утварь, нам пища
для мозгов нужна, а не для ...".
Одним словом все считают себя
как минимум "начавшими" и требу-
ют, именно требуют, углубления
своих знаний.
Что ж, тут нам есть, что Вам
ответить. К сожалению, недоста-
точно просто знать ассемблер,
чтобы учить ему других, надо еще
и уметь учить. А, как показывает
практика, эти два качества поче-
му-то стараются избегать друг
друга. На данном этапе нам пока
не удалось найти человека, дос-
таточно квалифицированного в
обоих вышеуказанных ипостасях,но
надежда, как известно, умирает
последней, и, возможно, Вы еще
сможете прочесть в нашем журнале
полный курс от "А" до "RESET
INTERRUPTION".
Ну а пока продолжаются поис-
ки,мы решили публиковать отдель-
ные тематические статьи, освеща-
ющие наиболее часто возникающие
у "начавших и углубивших" проб-
лемы. В ближайших номерах ZF мы
собираемся затронуть следующие
направления:
- оптимизация программ по ско-
рости и времени;
- быстрая графика;
- убогость TR-DOS и как с этим
бороться;
- 3D-векторная графика и 3D-
анимация.
Изменения в данном списке
возможны, даже необходимы, и бу-
дут производиться, в основном,
по мотивам Ваших писем. Сидя до-
ма в мягом кресле с бутылкой пи-
ва, автор не может догадаться,
чего же хочет народ - хлеба?
зрелищ? 3D-джойстик? или тоже
пива? А посему пишите, звоните,
заходите и излагайте свои мысли
по поводу необходимости той или
иной темы (лучше все-таки пиши-
те).
ГЛАВА ПЕРВАЯ.
"Скажи мне, какую
программу ты написал,
и я скажу, кто ты."
По долгу службы автор неод-
нократно сталкивался со следую-
щей ситуацией: появляется ново-
испеченный гений и, глядя на мир
свысока, преподносит этому само-
му миру свое творение, не усту-
пающее по гениальности своему
автору. Но при первом же тести-
ровании выясняются некоторые де-
тали: дрожит курсор в верхней
части экрана, дергаются спрайты,
скорость программы неравномер-
на... Да и это все только в том
случае, если новый шедевр вообще
соизволит работать не только на
машине его создателя, а и хотя
бы на половине серийных компью-
теров.
Глобальных причин такого при-
скорбного случая обычно две:
а) сей программист не придержи-
вается никаких стандартов и пра-
вил или единственно правильной
считает свою машину;
б) данный индивидум относится к
категории очень хороших учите-
лей.
Но, так как со вторым пунктом
этого резюме бороться практичес-
ки невозможно, мы остановимся на
первом, а именно поговорим о
стандартах.
Каждому синклеристу с пеленок
должно быть известно, что такое
маскируемые прерывания и для че-
го они нужны. Если же по каким-
либо причинам Вы пропустили сей
знаменательный период жизни или
Ваше детство проходило на клави-
атуре IBM PC, то, возможно, Вам
будет небезинтересно узнать не-
которые подробности об этом ко-
варном явлении.
Сигнал маскируемого прерыва-
ния (далее INT) вырабатывается
одновремено с приходом кадрового
синхроимпульса, имеющего частоту
50 герц (50 раз в секунду). По
приходу же кадрового синхроим-
пульса начинается построение ви-
деоизображения, но учитывая ап-
паратные особенности как компью-
тера, так и видеомонитора, экран
строится большего размера, чем
реально наблюдаемый. В стандарт-
ном компьютере время построения
восьми горизонтальных пикселей
занимает 4 машинных такта, одной
горизонтальной линии - 224 так-
та, а количество линий на экране
- 312. Таким образом можно вы-
числить количество тактов, кото-
рое способен выполнить процессор
за время построения всего экра-
на, - это число составляет около
70.000 тактов. Стоит также отме-
тить, что сюда входит и время
гашения INT, но это не столь су-
щественный фактор, к тому же для
его понимания нужно разбираться
в архитектуре компьютера и не на
любительском уровне.
Проза жизни заключается в
том, что это чисто теоретическое
значение, и на практике нужно
учитывать то, что ОЗУ обычно ра-
ботает тормознее ПЗУ и это вно-
сит коррективы в производитель-
ность.
Наблюдательный читатель уже
догадался,что видеоконтроллер ZX
выводит экран значительно быст-
рей, чем его может построить
программа, ведь элементарная ко-
манда LDI занимает 16 тактов, а
построение восьми бит экрана - 4
такта. Таким образом,если Вы на-
чинаете перестраивать экран од-
новременно с приходом INT'а и
пытаетесь охватить весь экран,
посреди этого благородного заня-
тия видеоконтроллер Вас догонит
и перегонит, и оставшаяся часть
экрана будет изображена только в
следующем цикле прерывания. Нас-
колько известно автору сего ма-
нускрипта, большая часть нового
поколения программистов все вы-
шеизложенное еще не осознала и
продолжает клепать дрожащие кур-
соры и мерцающие спрайты. Мето-
дам борьбы с этими явлениями и
посвящается следующая глава.
ГЛАВА СРЕДНЯЯ.
"Ничто не работает
так долго."
Для того чтобы усвоить, поче-
му возникают дрожащие курсоры,
рассмотрим весь процесс деталь-
но. Стандартный алгоритм курсор-
ной системы обычно выглядит сле-
дующим образом:
1. запоминаем в буфер содержи-
мое экрана в том месте, где бу-
дет выведен курсор;
2. накладываем на экран курсор
по маске;
3. опрашиваем клавиатуру, пе-
ресчитываем координаты курсора;
4. восстанавливаем содержимое
экрана на месте курсора в преды-
дущей позиции и переходим на
пункт 1.
Естествено, встает вопрос о
синхронизации всего этого дела с
прерываниями и, следовательно, с
началом построения экрана.
Наиболее оптимальным выходом
является использование команды
HALT между третьим и четвертым
пунктом,и минимальное количество
процедур, висящих на прерывании,
а еще лучше полное их отсутствие
или приоритетное распределение
по времени выполнения. И тут на-
чинается самое интересное.
От начала видеоэкрана до пер-
вого пиксельного ряда рабочего
экрана (т.е. начала видеобуфера,
располагающегося с адреса #4000)
в стандартной машине выстраива-
ется 70 линий бордюра, что зани-
мает 15.680 тактов. Однако оби-
лие загадочных (читай-тормозных)
схемотехнических решений некото-
рых компьютеров заставляет при-
держиваться несколько другой
цифры. Автор еще не встречал ма-
шин тормозней Скорпиона и посему
рекомендует Вам придерживаться
критических показаний этой маши-
ны, а именно 60 линий, что сос-
тавляет 13.440 тактов.
Так вот, если процедуры сти-
рания курсора, копирования буфе-
ра и наложения курсора влезают в
пределы этой цифры, курсор выг-
лядит очень даже симпатично и не
имеет никаких шансов устроить
мегадрожание ни в одной части
Спектрумовского экрана. Ярким
примером может являться оболочка
ZF и, в особенности, MEMORY TEST
из теневика второго номера. Если
Вы приглядитесь внимательно, то
заметите, что одновременно обра-
батываются два курсора, совокуп-
ный размер которых составляет 10
знакомест.
Подводя предварительный итог
всему вышесказанному, автор при-
носит свои извинения, если Вам
что-либо было непонятно по при-
чине неумения этого самого авто-
ра доступно излагать материал на
бумаге. Но, если Вы все еще чи-
таете и Вам все еще интересно,
то я, пожалуй, изложу резюме
первой части.
Главное требование к програм-
ме, работающей с динамической
графикой заключается в следую-
щем: какую бы часть экрана эта
програма ни перестраивала, на
какой бы она машине ни работала,
для отсутствия мерцания изобра-
жения во время построения оного,
видеоконтроллер не должен пере-
секать перестраиваемую область.
При этом никакой роли не играет,
Вы его обгоняете, или он Вас.
Несмотря на то, что в данной
главе были изложены лишь основы
анатомии ZX, этого должно быть
достаточно по крайней мере для
начала экспериментов, которые
рано или поздно приведут Вас к
полному консенсусу с динамичес-
кой графикой и бордюрными строч-
ками.
Но, как недвусмысленно пока-
зала история, эксперимент экспе-
рименту рознь, и остроту ножа
нужно проверять на чужом горле.
Развивая эту мысль, мы незаметно
подкрались к следующей главе, из
которой Вы, возможно, подчерпне-
те кое-что интересное о методах
отладки программ, критичных по
времени и местоположению в цикле
прерывания.
ГЛАВА ПОЧТИ ПОСЛЕДНЯЯ.
"Я фигею, Тосик,
бамбук зацвел."
Многих програмистов частенько
волнует вопрос "а как долго ра-
ботает моя новая/старая/улучшен-
ная/углубленная процедура?". Ес-
ли Вы еще не догадались сделать
какую-либо аппаратную примочку,
и Ваши мозги не предрасположены
к извращенному ходу мысли, то, в
большинстве случаев,молчание бу-
дет Вам ответом. Однако, как
сказал классик, все гениальное
просто, и описываемый ниже спо-
соб полностью соответствует это-
му тезису.
Первым делом Вам следует вык-
лючить все турбо-режимы и тормо-
за и привести машину в наиболее
приближенный к стандарту режим
работы. Далее возьмите полоску
бумаги шириной 2 см 97 мм и вы-
сотой с экран Вашего любимого
телевизора или монитора и при-
бейте ее к этому самому экрану.
Закончив это высокоинтелектуаль-
ное занятие, загрузите TASM 4.0
(XL Design) и набейте следующую
программу:
ORG #8000
DI ;создание
LD HL,#FE00 ;вектора
LD A,H ;маскиру-
LD I,A ;емых
INC A ;преры-
LD (HL),A ;ваний
INC L
JR NZ,$-2
LD C,H
INC H
LD (HL),A
LD L,A
LD (HL),#C9
IM 2
;основной цикл, иными словами
;сама суть
LOOP EI
LD B,7
HALT
OUT (C),B
OOPS DS 13440/4,0
OUT (C),0
XOR A
IN A,(C)
CPL
AND #1F
JP Z,LOOP
LD A,#3F
LD I,A
IM 1
EI
RET
Следует отметить, что упоми-
нание TASM 4.0(XLD) не было слу-
чайным. Сей продукт рекомендует-
ся по причине реализации в нем
таких нужных команд, как OUT
(C),0 и DS.
Результатом работы данной
программы будет полоса белого
цвета на черном бордюре, синхро-
низированная с началом экрана.
Далее Вам следует взять фломас-
тер и провести на приклеенной к
телевизору бумажке черту, парал-
лельную нижнему краю белой поло-
сы. Рядом с этой чертой напишите
"13.440" и, если Вы еще не поня-
ли сути метода,то медицина здесь
бессильна (добрая шутка). Внима-
тельный читатель уже догадался о
смысле строки программы, поме-
ченной меткой OOPS. Она создает
в памяти 13440/4=3360 команд
NOP, выполнение которых и зани-
мает собственно 13440 тактов.
Таким образом, посидев десять
минут около монитора с фломасте-
ром в зубах, подставляя в эту
строчку значения в тысячах так-
тов, Вы составите шкалу, которой
будете пользоваться всю оставшу-
юся сознательную жизнь. При же-
лании можно сделать разметку на
каждую тысячу тактов, но это,
конечно, если хватит терпения и
чернил.
Теперь перейдем ко второй
части данного метода. Чтобы оп-
ределить, в каком месте цикла
прерывания находится определен-
ная подпрограмма и какое время
она выполняется, Вам нужно сде-
лать три элементарные вещи:
1. перед началом искомой под-
программы поставить вывод на
бордюр какого-либо цвета, отли-
чающегося от основного цвета
бордюра;
2. по окончании данной подпрог-
раммы восстановить фоновый цвет
бордюра;
3. посмотреть на бордюре во
время выполнения программы, где
находится выделенная п/п и, в
соответствии со шкалой, высчи-
тать ее продолжительность.
В большинстве случаев, осо-
бенно если Вы еще мало представ-
ляете себе программирование в
реальном времени, реакцию экспе-
риментатора иными словами, как
полное офигевание и воззвание к
великому Тосику, не назовешь.
Если и сейчас Вам непонятна суть
данного метода,то прямая Вам до-
рога в клуб любителей Денди-Ме-
гаЮниор или в ближайший магазин
за PENTIUM-133.
Вот так, шаг за шагом, мы по-
дошли к финальной части сегод-
няшней лекции, в которой обобще-
ны основные требования к прог-
раммам и программистам, а также
даны кое-какие полезные для здо-
ровья советы.
...