RUSH
#01
29 мая 1999 |
|
AMIGA NEWS - Программинг на Amiga: О Amiga изнутри, Графика, Сопроцессоры, Особенности ассемблера.
Азы программирования на "классических" Ammy. Этот текст я писал довольно давно, но и сейчас многие интересующиеся кодингом на Amiga, могут найти в нем базовую информацию, которая поможет разобраться в структуре этой машины и начать писать что-то свое... О AMIGA ИЗНУТРИ... Многие сейчас паралельно со SPECCY осваивают AMIG'у. Малое количество информации и данных по этой машине заставляет всех добиваться результатов и знаний тяжелым трудом и ценой многих часов "ковыряния" в чужих программах. Мы хотим поделиться своими знаниями и теми скромными достижениями, которые имеем на данный момент. Нужно сказать, что мы сами находимся лишь на начальном этапе освоения AMIG'и, поэтому вполне возможны ошибки и неточности в данном тексте. Но все же - это лучше чем полное отсутствие информации. Данная статья предназначена как для тех, кто сейчас изучает "внутренности" AMIG'и, так и для тех, кто хочет побольше узнать о этой машине перед ее покупкой. Сейчас наша группа переживает очень бурный период "амигизации". Мы делаем для себя множество интересных и увлекательных открытий и находок... Все похоже на ситуацию со SPECCY 5-7 лет назад, когда мы были в восторге, написав простенькую бегущую строчку, подвесив музыку на прерывания или выведя на экран картинку. Правда разница в том, что тогда мы осваивали SPECCY каждый сам по себе, а сейчас пытаемся "раскрутить" "ПОДРУЖКУ" общими усилиями. Отличие также состоит и в том, что структура SPECCY гораздо проще и доступнее, чем AMMY. Но мы ужe знакомы с основными приемами программирования, и опыт накопленный на SPECTRUM'е очень сильно помагает нам в работе. Освоением AMIG'и в основном занимаемся я и RUFF. (примечание: сейчас RUFF несравнимо опередил меня, стал отличным кодером и, надеюсь, напишет для журнала более обстоятельные и профессиональные статьи о программировании на Amiga). У меня A600, в базовой конфигурации (пока :-), у RUFF'а A500+ с KickStart'ом от A600 и с двумя "метрами" памяти. Из литературы пока имеется только книга Дмитрия Михайлова, которого так и хочется назвать амижным Николаем Родионовым, - "AMIGA#1" (описание операционной системы, внутреннего языка ARREX). Также, есть диск в формате гипертекста (с менюшками по тексту) с описанием ассемблера MC680x0 и три диска гипертекстов о работе с внешними устройствами, сопроцессорами, библиотеками и т.д. Все это тексты на английском языке, что несколько затрудняет восприятие, но вполне приемлимо. Надо заметить, что эти диски попали к нам благодаря ребятам из Smash Band - MIGHTY и GRUNGE. Не будем вдаваться на этот раз в подробности ассемблера и кодинга на AMIGA, тем более, что и сами не многое знаем, а расскажем о всем вцелом... ГРАФИКА: Во первых, опровергнем кое-какие бытующие в кодерских кругах слухи - будто бы на AMMY можно менять разрешение экрана от одной точки на целый screen, до тысячи и больше... Все гораздо скромнее (но нужно заметить, что все о чем я пишу в этой статье касается только AMIG без AGA режима. У них же, графические возможности намного выше. AGA амиги - это A1200, A4000). Так вот... Стандартными режимами графики, которые поддерживает AMIGA с ECS набором чипов (A1000, A2000, A500, A500+, A600, A3000) являются следующие: (для режима развертки PAL) LOW resolution, NON INTERLACED: 320x256 LOW resolution, INTERLACED: 320x512 HI resolution, NON INTERLACED: 640x256 HI resolution, INTERLACED: 640x512 Плюс режим Super Hi resolution, когда разрешение по X равно 1280 пикселям. При этом, LOW и HI resolution - это режимы горизонтального разрешения. Режим высокого (HI) разрешения не вызывает мерцания, но замедляет работу центрального процессора. INTERLACED и не INTERLACED - это режимы вертикального разрешения. При подключении INTERLACED развертка будет происходить черезстрочно (кадр - четные строки, другой кадр - нечетные). Данная смена строк будет вызывать мерцание. Подобные способы улучшения качества картинки применяются в последнее время и на SPECCY, но на AMIGA это сделано аппаратно. Спрциальные устройства и универсальные мониторы с системой DOUBLE PAL позволяют выводить "интерлейснутые" картинки абсолютно без мигания. Предвидя огорчение или же злорадство :-) на ваших лицах по поводу достаточно скромного разрешения, скажу, что это стандартное разрешение обычного телевизора. И даже картинки 320x256, с собственым цветом для каждой точки, смотрятся великолепно. А вообще-то я, как и все, сразу советую вам покупать AGA'шную Амигу и наслаждаться ее великолепной графикой. Далее... У Амиги нет BORDER'а, это значит, что она может формировать изображение по всей плоскости экрана. Перечисленные выше режимы разрешения были даны для стандартно видимых областей экрана, общее же разрешение (часть экрана невлазит в кадр) по вертикали равно 312 строк. Подобие же BORDER'а создается по усмотрению кодера, и делается это для того, чтобы картинка влазила целиком в экран любого монитора или телевизора. На AMIGA нет жестко привязанной экранной памяти как на SPECCY. Там достаточно сопроцессору указать из какого места CHIP памяти извлекать картинку, куда ее выводить на экране и какой формат этих данных. Размер экрана в памяти зависит от нескольких факторов: разрешение (вертикальное и горизонтальное) и количество цветов. Графика хранится в специальном формате - в виде битпланов. Битплановая графика это, по сути, такой же формат графики как на SPECCY, то есть состояние каждой точки на экране определяется тем включен ли соответствующий бит или нет. Большее количество цветов достигается тем, что несколько битпланов можно накладывать один на другой. В случае если подключено больше чем 1 битплан, при отображении каждой точки, будет браться по биту из каждого битплана и полученное число будет соответствовать номеру цветового регистра. Цветовые регистры - это 32 двенадцатибитных значения, каждое из которых содержит в себе один код цвета из палитры 4096 цветов. За каждый из основных цветов тут отвечает по 4 бита: 15-12 не используются 11-8 RED (красный) 7 -4 GREEN (зеленый) 3 -0 BLUE (синий) Так черному цвету соответствует код $0000, белому $0FFF, красному $0F00, серому со средней интенсивностью $0999 и т.д. Как видите, цветовые регистры очень просто задавать в шестнадцатиричной системе. Далее о битпланах... Всего одновременно может быть подключено до 6 битпланов. Такая вот битплановая экранная область называется фоном (playfield). За пределами фоновой картинки невозможно выводить никакие изображения включая спрайты. Есть также режим с двумя фонами, когда на экране формируются две независимые картинки любого размера. В двухфoновом режиме в каждом из фонов можно задать до трех битпланов. Кстати, кол-во битпланов часто называют глубиной изображения (DEPTH). Естественно, чем больше битпланов задано одновременно, тем большее количество цветов можно выводить: кол-во битпланов кол-во цветов 1 2 2 4 3 8 4 16 5 32 Итак, стандартно можно выводить до 32-х цветов на экране одновременно, при этом каждый цвет произвольно выбирается из палитры 4096 цветов. Это не так уж и мало, учитывая, что можно самому формировать палитру и окрашивать каждый пиксель в собственный цвет. Во всяком случае игрушки и демки смотрятся очень красочно и превлекательно. Шестой битплан используется в режиме HalfBright, который позволяет увеличить кол-во цветов до 64, при этом дополнительные 32 цвета берутся из стандартных цветовых регистров с половинной яркостью. Также есть режим Hold And Modify (HAM), в котором можно выводить одновременно все 4096 цветов, но при некоторой зависимости цвета близлежащих точек одна от другой. Производится своеобразная аппаратная компрессия. Режим эффективен для статичных картинок и заставок, но динамическая графика в HAM усложнена. Еще есть какой-то загадочный режим с разрешением 640х480 с четырьмя цветами из палитры в 64 цвета. Правда и о нем я мало что знаю. Каждый фон (playfield), может быть произвольного размера. Можно выводить на экран лишь его часть. Сопроцессор (COPPER) сам будет отступать промежутки в длине стоки. Также, существуют аппаратные средства для плавного скроллинга фонов по вертикали и горизонтали. Амига мoжет независимо выводить до 8ми спрайтов заданного размера, отслеживать их местоположение на экране и наложение друг на друга, либо на один из фонов. Размер спрайтов по X не должен превышать 16 пикселей, по Y - ме ограничен. Стандартно спрайты 4-х цветные (со своей собственной палитрой), но можно обьединить по два спрайта в один и получить при этом 16 цветов. СОПРОЦЕССОРЫ: Теперь о аппаратных средствах AMIGA. У каждой Амиги есть два очень полезных "инструмента" для работы с внешними устройствами и для получения различных аудио-визуальных эффектов. Это: COPPER - занимается формированием изображения, синхронизирует вывод графики с разверткой путем отслеживания текущего положения луча. Также, на нем "висит" обслуживание 4-х звуковых каналов. BLITTER - позволяет быстро рисовать линии, закрашивать определенные области в изображении. Также, BLITTER может использоваться для быстрой переброски данных по памяти. За секунду BLITTER может поставить около 1 миллиона точек (в линии). Для примера скажу, что на SPECCY можно вытянуть где-то 50 тысяч точек в секунду, да и то с трудом. А выводя миллион точек 7Мгц'ная AMIGA может паралельно играть крутую оцифрованную музыку, подгружать что-то с диска и делать еще кучу различных операций... COOL ! Одна точка ставится за 8 тактов. BLITTER организован очень гибко и позволяет рисовать графику в фонах различного размера и разрешения. Для управления сопроцессорами и контроля внешних устройств исползуются так называемые HARDWARE регистры (регистры управления железом либо хардвэйрные регистры). Каждый из регистров имеет свой собственный адрес, занося либо считывая в/из которого данные, можно общаться с внешним миром и командовать всей мощнейшей структурой машины. Как это делать я расскажу в следующий раз, когда сам разберусь во всех тонкостях. ОСОБЕННОСТИ АССЕМБЛЕРА: Самым главным и мучительным отличием от SPECTRUM'овского ассемблера являются непривычно большие адреса, состоящие из четырех байт. Поначалу очень сложно воспринимать столь большие значения. Также прикольным отличием является то, что в Амижном ассемблере, при занесении значений из источика в приемник, слева (до запятой) записывается источник, а справа (после запятой) - приемник. На SPECCY и на PC все совсем наоборот. Кстати, амижный стандарт более свойственен европейскому человеку, привыкшему читать слева-направо. Для тех, кто еще не "врубился" в вышесказанное, обьясняю, что при LD A,B, (амижный аналог команды LD - MOVE) будет занесено значение регистра A в регистр B. Также, каждая команда работающая с числовыми значениями должна иметь идентификатор (букву записываемую после точки): .b - один байт .w - слво (два байта) .l - длинное слово (четыре байта) Данный идентификатор служит для разделения типов данных. В ассемблерах принят несколько отличающийся от спектрумовского стандарт записи чисел. Так, перед шеснадцатиричными числами ставится знак "$", перед десятичными не ставится ничего. В случае использования непосредственной адресации перед числом ставится знак "#". Данная особенность может привести к путанице. Аналогом спектрумовского DEFB является команда DC (повидимому, Define Code), после которой тоже ставится идентификатор. Так, команда "DC.L $0" - означает, что по текущему адресу компиляции будет помещено четыре байта заполненных нулем. Сами по себе программы-ассемблеры (я видел "ASM ONE", и две версии "GENS") снабжены великоллепными редакторами текста (не стоит вспоминать "GENS" на SPECCY :-). Также, очень приятна отладка программ прямо по тексту. Правда функций в долбагере маловато (STS круче !), но я не знаю как выглядят отдельные отладчики, и говорю о встроенном в "ASM ONE". Регистры в AMIG'е 32-х разрядные (даже в 16 битных A500, A600...). Есть два вида основных регистров: регистры данных и регистры адреса. И тех и других аж по 8 штук - D0-D7, A0-A7. Регистры данных, это что-то типа SPECTRUM'овских HL,DE,BC, только все они одинаковые и имеют по 4 байта. С этими регистрами производится большинство логических и арифметичехких операций. Регистры адреса, это похожие на наши IX и IY, то есть - индексные регистры. Используя их можно адресовать память со смещением, но не +,- 128 байт, а +,- 32768 байта ( COOL ! ). В совокупности с тем, что имеются команды переходов и вызовов подпрограмм по относительному адресу в таком же диапазоне - это позволяет писать довольно большие перемещаемые программы. Также есть очень приятная возможность ставить в операциях с адресными регистрами "+" или "-" после скобок, при этом содержимое адресного регистра будет уменьшено или увеличено на число зависящее от типа данных ( b, w, l). Например команда MOVE.W #0,(A0)+ означает, что по адресу на который указывает регистр A0 будет помещено два байта "0", а значение A0 будет увеличено на 2. Это позволяет просто и эффективно работать с блоками памяти. В микропроцессорах MC680x0 набор флагов очень схож с набором флагов в Z80. Тут имеются: X - флаг расширения N - флаг знака Z - флаг нуля V - флаг переполнения C - флаг переноса Проверка флагов и переходы по условиям осуществляются несколько иначе чем на SPECCY, а именно - в командах работающих по условию ( B, DB, S и т.д.) к имени команды, без всяких запятых, прмписывается имя условия. Вот список всех условий: F False Z=1 T True Z=0 HI HIgh C+Z=0 LS Low or Same C+Z=0 CC Carry Clear C=0 CS Carry Set C=1 NE Not Equal Z=0 EQ EQual Z=1 VC V=0 VS V=1 PL PLus N=0 MI MInus N=1 GE Greater or = N(+) V=0 LT Less Than N(+) V=1 GT Greather Then Z+(N(+)V)+ LE Less or = Z+(N(+)V)- Более подробно о всех комаднах Моторолы я постараюсь рассказать в другой раз (включая действие на флаги и конкретные примеры). А на сегодня наверное хватит.... Делитесь с нами своими знаниями и достижениями. Пишите, спрашивайте, исправляйте, советуйте... При создании данной статьи использовались: "MC680x0 GUIDE" "CODER COMPANION (vol.1,2,3)" "AMIGA#1" (C) Д.Михайлов Амигу кроме меня изучали RUFF и ZNAHAR. УДАЧИ В БОРЬБЕ ЗА ДЕЛО АМИЖНОЙ ПЛАТФОРМЫ !
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября