Здорово! На связи Дентор из Асфиксии также известный как Grant Smith. Эта тренировочная программа предназначается для всех юных демо кодеров. Я полагаю, что читатель достаточно молод и имеет за плечами как минимум 6 классов образования, до этого программировал в основном на бейсике и хочет узнать как написать демо самому. Вот что я собираюсь сделать: я собираюсь описать как работают некоторые стандартные механизмы и даже дам вам исходный код. Исходник подразумевает, что у вас есть VGA карта, способная работать в режиме 320х200х256. Я также предполагаю, что у вас есть Turbo Pascal 6 или выше (это потому, что некоторые участки кода будут написаны на ассемблере и ТП6 делает это легко доступным). В конце первых «рабочих» секций вы сможете написать некоторые прикольные демки самостоятельно. Я дам вам необходимую информацию и уже вы будете решать как ее применять. Почему бы вам не закачать пару наших демок и не посмотреть о чем вообще речь ? Я буду оставлять одну часть в неделю на BBS. Далее – не интересно. В первой части я покажу как спроектировать вашу Паскаль программу, как получить режим 320х200х256 без BGI файла и несколько методов вывода пиксела и очистки экрана. Заметьте: я выложил исходный код с объяснениями. Вам не нужно переносить его с места на место, в конце каждой части я доьавил маленькую программу которая применяет новые изученные приемы. Если вы не до конца понимаете какую-нибудь секцию, отправьте мне приватное письмо в котором опишите суть проблемы; я постараюсь объяснить. И последнее: если вы найдете сделанную мной ошибку напишите мне письмо и я ее исправлю. Привет еще раз, жаль что приходится это добавлять, но нужно. Все исходники, полученные из данной серии вы используете на свой страх и риск Дентор и команда Асфикция не несет никакой ответственности за потери связанные с использованием этого кода. Я могу сказать что этот код использовался во многих демах, приложениях и т.д. и все везде работало нормально, но если что не так – нас не вините. Мне очень жаль, но дела обстоят именно так… The MCGA mode and how you get into it in Pascal without a BGI Давайте признаем: BGI бесполезен для демо кодинга. Трудно найти что-либо более медленное, чем BGI драйвера для программирования графики. Также они не поддерживают 256 цветный режим. Вам нужно достать внешний 256 цветный BGI VGA драйвер для Паскаля. Так что вопрос остается: как войти в режим MCGA 320x200x256 на Паскале без BGI ? Ответ прост: язык Ассемблера. В ассемблере есть много функций управления VGA картой и это одна из них. Если вы посмотрите книгу …. , то она скажет, что…. INT 10h, 00h (0) Set Video Mode Устанавливает видеорежим На входе: AH 00h AL видеорежим Возращает: ничего Затирает регистры: AX, SP, BP, SI, DI Все это хорошо, но что это означает? Это означает, что если вы загрузите видеорежим в AL и вызовете прерывание 10h, СЕЗАМ! Вы в выбранном режиме. Теперь: MCGA – режим с номером 13h и вот что мы делаем в Паскале: Procedure SetMCGA; BEGIN asm mov ax,0013h int 10h end; END; Все! Есть! Один вызов этой процедуры и БАХ! Вы в режиме 320х200х256. Пока мы ничего не умеем в нем делать, так что вернемся в текстовый режим номер которого 03h, как показано ниже: Procedure SetText; BEGIN asm mov ax,0003h int 10h end; END; Опа! Вот мы и вернулись в текстовый режим! И что теперь ? Мы зашли в нужный режим, но как нам ПОКАЗАТЬ что-то на экране ? Для этого смотрим след. секцию: Закраска (в оригинале «очистка») экрана нужным цветом. Теперь, когда мы в MCGA режиме, как нам его закрасить ? Ответ прост: вы только должны запомнить, что базовый адрес экрана $A000. От $A000, следующие 64000 байтов – это то, что непосредственно рисуется на экране (заметьте: 320*200 = 64000). Так что для очистки экрана вам нужно применить команду FillChar таким образом: FillChar (Mem [$a000:0],64000,Col); Эта команда памяти передает базовый сегмент и смещение: в этом случае адрес экрана – базовый сегмент, смещение = 0. 64000 – размер экрана (см. выше) и Col – цвет, значение от 0 до 255 которое представляет собой цвет которым будет окрашен экран. Вывод пиксела на экран (два разных метода) Если вы заглянете руководство Нортона по выводу пиксела на экран, то вы увидите следующее: Запись пиксела определенного цвета на заданные экранные коррдинаты: На входе:AH 0Ch AL цвет пиксела CX горизонтальная позиция пиксела DX вертикальная позиция пиксела BH номер страницы (для видеорежимов с более чем одной страницей) Возвращает: ничего Затирает рагистры: AX, SP, BP, SI, DI Как видно из нашего примера SetMCGA, написать нужно следующее: Procedure INTPutpixel (X,Y : Integer; Col : Byte); BEGIN asm mov ah,0Ch mov al,[col] mov cx,[x] mov dx,[y] mov bx,[1] int 10h end; END; Х – будет х-координатой, У – У-координатой и Col – цвет выводимого пиксела. Заметьте, у MCGA есть 256 цветов, пронумерованных от 0 до 255. Начальная палитра весьма ?grotty? и я покажу как ее изменить позже, а пока давайте поохотимся за цветами которые подойдут для того что нам надо. Удачно, что байт как раз от 0 до 255, поэтому именно его мы должны передавать в качестве переменной цвета. Взгляните сюда: CGA = 4 colours. 4x4 = 16 EGA = 16 colors. 16x16 = 256 VGA = 256 colors. Поэтому, EGA – это CGA в квадрате, а VGA – EGA в квадрате… ?