ПЭВМ АГАТ: Передовица » Макулатура » ИиО » АГАТ рисует

АГАТ рисует (N3/1989)

Статья посвящена самой "ассемблерной" части агатовского Бейсика - работе со спрайтами. Эта тема для начинающих была явно сложновата и по ней регулярно появлялись статьи в журналах. В тексте присутствуют опечатки, но лучше так чем совсем ничего.

Четыре оператора агатовского Бейсика DRAW, XDRAW, ROT= и SCALE= существовали и в исходном Бейсике Apple][. Эти операторы предназначены для вывода спрайтов - т.е. заранее подготовленных в памяти графических образов, причем работают эти операторы только в режиме высшей графики. Мне не известны подобные операторы или их аналоги в других реализациях Бейсика на ПЭВМ того периода, кроме, пожалуй, Ямахи. Однако, в отличие, например, от ямаховского Бейсика, спрайты Агата могли масштабироваться и поворачиваться на произвольный угол и не были ограничены в размерах описателя (зато у Ямахи спрайты поддерживались аппаратно).

Странность и сложность же их использования состоит в том, что таблица образов (а их может быть несколько) должна быть задана интерпретатору не в виде обычной именованной basic-переменной или массива, а путём записи в специальные ячейки физического адреса этой таблицы. Более того, данные в таблице могут хранится в упакованном виде и алгоритм упаковки также описан в документации, что окончательно добивало начинающих. Поэтому часто агатовские инструкции по этим операторам называют "туманными" и "неясными". На самом деле никакого тумана там нет, но по сравнению с общей концепцией Бейсика, как простого для понимания языка, упоминание байт, бит и физических адресов, конечно, оказывается "не в тему". Возможно, тем самым разработчики планировали сделать выполнение этих операторов более быстрым, но мне кажется, что эта цель не была достигнута...

В.Дементеев. г.Биробиджан. Группа сайта просит вас связаться с нами! (ЗАЧЕМ ЭТО?)

«Лучше один раз увидеть, чем сто раз услышать». В справедливости этой пословицы легко убедиться на уроках информатики при изучении тем, связанных с получением графических изображений. На экране дисплея ПЭВМ «Агат» можно получить любые зрительные эффекты: объекты могут менять цвета, форму, возникать и исчезать, двигаться и совершать другие завлекательные действия.

Программирование изображений - занятие не простое, но очень увлекательное. Наглядность результата, возможность влиять на ситуацию стимулируют у учащихся желание составлять «графические программы». Как правило, к этому стремятся даже слабые ученики.

Создание статических изображений достаточно хорошо описано в руководстве по программированию на «Агате», поэтому остановимся на программировании динамических изображений. Описываемые упражнения выполнялись учениками IX-X классов средних школ г.Биробиджана.

Программировать динамические объекты, пользуясь оператором PLOT, очень сложно и возможно лишь в случае простых фигур (блин, тарелка, книга, змея, треугольник...). Рисунок может быть цветным, но скорость движения объектов мала, программы громоздки, неудобны для чтения.

Для управления изображениями объектов со сложной конфигурацией и большой динамичностью используются операторы DRAW, XDRAW, ROT, SCALE, работающие в режиме ГВР (графика высокого разрешения). Объем ОЗУ «Агата» не обеспечивает цветной графики с высокой разрешающей способностью, поэтому предложенные ниже примеры одинаково выглядят на цветном и черно-белом дисплеях.

Изображение строим по принципу «черепашки», которая перемещается по экрану и, когда необходимо что-либо начертить, опускает хвост; при движении без черчения хвост поднят. Для управления действиями черепашки в пределах одного шага используются три бита, которые обозначим РДД.

 Бит Р управляет хвостом:
 0 - хвост поднят (движение без черчения);
 1 - хвост опущен (движение с черчением).
 Биты ДД указывают направление движения.
00 - вверх по экрану;
01 - вправо;
10 - вниз;
11 - влево.

Последовательность шагов записывается в последовательность ячеек оперативной памяти, называемую описателем. Один или несколько таких описателей вместе со служебной информацией составляют таблицу образов.

Каждый байт описателя разделён на три выполняемые последовательно секции A, B, C, каждая из которых описывает один шаг. Структура байта описателя приведена в табл. 1.

Секция C не содержит бита Р, в неё записывается только движение вниз, вправо и влево без черчения.

Для получения изображения на экране нужный описатель считывается из памяти ПЭВМ операторами

XDRAW I AT X,Y
или
DRAW I AT X,Y

где XDRAW - воспроизведение объекта белым цветом, DRAW - чёрным; I - номер описателя; X и Y - координаты начала движения. Команды XDRAW и DRAW просматривают описатель секцию за секцией. Если секции, оставшиеся до конца байта, содержат одни нули, они игнорируются. Например, байт описателя не может заканчиваться секцией C, равной 00 (движение вверх без черчения), так как она будет проигнорирована. Просмотр описателя заканчивается, когда встречается байт, все биты которого равны нулю.

Для примера изобразим на экране прямоугольник с отсечёнными углами (рис. 1), который увеличивается в размерах и вращается.

Выбираем начальную точку 0 и строим путь движения «черепашки» (рис. 2). Учитываем, что повороты возможны только на 90 градусов.

Последовательность шагов рис. 2, начиная с точки 0, такова:

Закодируем её и запишем в табл. 2.

Если код шага невозможно поместить в данную секцию, то она заполняется нулями, а код переносится в следующий байт.

Переводим значения байтов из двоичной системы счисления в шестнадцатеричную, используя табл. 3.

Записываем описатель в шестнадцатеричной системе счисления:
12 1F 20 44 6D 32 D6 07 00

Эту последовательность байтов необходимо записать в память «Агата».

Для завершения создания таблицы образов необходимо закодировать ещё некоторую служебную информацию. Она предшествует описателю и показана в табл. 4.

К - адрес, с которого таблица образов записывается в оперативную память. Все адреса хранятся в порядке «младший байт, старший байт».

В нашем примере таблица образов содержит один описатель, следовательно, в шестнадцатеричном формате значения байтов будут следующие: [K]=01; [К+1]=00; [К+2]=04; [К+3]=00. Абсолютный адрес первого байта описателя равен К+4, а относительный равен 4. Описатель закончится байтом 00.

Запись таблицы образов производим в ОЗУ пользователя начиная с адреса K=1DFC. Выбирая адрес, нужно быть очень внимательным, чтобы при работе программы ваши исходные данные не были испорчены. Если же такая неприятность произойдёт - измените начальный адрес размещения таблицы образов.

Командой CALL - 151 входим в системный монитор. Набираем на клавиатуре 1DFC: 01 00 04 00 12 1F 20 44 6D 32 D6 07 00 <ввод>. По этой команде таблица образов будет помещена в ОЗУ начиная с адреса 1DFC. Далее необходимо сообщить интерпретатору адрес начала таблицы. Для этого служат ячейки Е8 и Е9, причём в Е8 записываются младшие разряды адреса, а в Е9 - старшие. В системный монитор адрес помещаем следующим образом:

E8: FC 1D <ввод>

Затем необходимо вернуться в интерпретатор, либо набрав E003G <ввод>, либо одновременно нажав клавиши СБР и УПР.

При наличии пригласительного знака набираем следующую программу.

10 HGR=2: X1=0
20 FOR X=0 ТО 15
30 SCALE=X: ROT=2*X
40 XDRAW 1 AT 120,120
50 SCALE=X1: ROT=2*X1
60 DRAW 1 AT 120,120
70 X1=X
80 NEXT X
90 GOTO 10

 Здесь строка 10 задаёт режим ГВР, начальное значение X1;
20 - заголовок цикла;
30 - масштаб и угол поворота;
40 - воспроизведение объекта белым цветом;
50 - изменение масштаба и угла поворота;
60 - воспроизведение объекта чёрным цветом;
70 - запоминание параметра;
80 - конец цикла;
90 - безусловный переход.

Эта программа обеспечивает отсутствие мигания при вычерчивании объектов. При исполнении программы таблица образов и её адрес должны находиться в памяти машины. Чтобы при повторном запуске программы каждый раз не вводить с клавиатуры таблицу образов, её необходимо либо сохранить на магнитном диске, либо ввести в текст программы. На ГМД таблице записывается командой

BSAVE <имя>, A¤1DFC, L¤D

где имя - идентификатор, под которым таблица будет записана в библиотеку В;
A¤1DFC - начальный адрес таблицы;
L¤D - количество байтов в таблице.

По команде BLOAD <имя> таблица образов вызывается с ГМД и загружается в память по адресу, с которого она была прочитана (1DFC).

Не вызывая системный монитор, непосредственно в тексте программы командами POKE ¤E8, ¤FC: POKE ¤E9, ¤1D можно поместить адрес таблицы образов в ячейки Е8 и Е9 (¤ - признак шестнадцатеричного формата записи чисел и адресов). Кроме того, таблицу образов можно задать в тексте программы с помощью последовательности команд POKE.

Рассмотрим фрагмент программы «Гонки на парусных лодках», созданной членами кружка информатики. В программе используются генераторы случайных чисел для изменения скорости движения лодок, задаётся длина дистанции (сколько раз лодки должны «проплыть» по экрану), выдаётся сообщение о том, чья лодка пришла к финишу первой, второй, третьей и за какое время.

Таблица образов для рисования парусной лодки и стирания её следа:
02 00 06 00 12 00 2D D5 3F 3F 03 28 2D 24 24 37 05 00 24 04 18 FE 92 35 35 3F 24 00

Во фрагменте приведённой ниже программы таблица с ГМД вводится в ОЗУ, и на экране появляется изображение трёх движущихся лодок.

1 PRINT CHR$(4) «BLOAD LODKA»
5 POKE $E8; $FC: POKE $E9, $1D
10 HGR=2
20 SCALE=3
30 ROT=0
40 FOR X=0 TO 255
50 XDRAW 1 AT X, 128
53 XDRAW 1 AT X+3,108
55 XDRAW 1 AT X+7,148
60 DRAW 2 AT X1,128
65 DRAW 2 AT X1+3,108
67 DRAW 2 AT X1+7,148
70 X1 = X
80 NEXT X
90 GOTO 40

Для учеников графика является одной из любимых областей применения компьютера, а для учителя должна играть не последнюю роль при создании обучающих программ по алгебре, геометрии, физике, черчению и другим предметам. Создавать такие программы нужно как можно активнее.

* * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *