ZX Format
#03
29 февраля 1996 |
|
Программистам - ассемблер: Экскурс в анатомию ZX
Экскурс в анатомию 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. Вот так, шаг за шагом, мы по- дошли к финальной части сегод- няшней лекции, в которой обобще- ны основные требования к прог- раммам и программистам, а также даны кое-какие полезные для здо- ровья советы. ...
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября