Техника - молодёжи 1990-04, страница 47

Техника - молодёжи 1990-04, страница 47

Клуб электронных игр

Склад копийу

которые сделали мы

Анатолий ВЕРШИНСКИЙ — поэт-профессионал. Автор четырех поэтических сборников, исторической драмы в стихах и многочисленных журнальных публикаций (в том числе и в «ТМ»). Однако на этот раз его привело в редакцию отнюдь не желание порадовать наших читателей очередным стихотворным шедевром. Анатолий принес плоды своих изысканий по проблеме, которая, по убеждению администрации клуба, заинтересует многих и многих самодеятельных разработчиков компьютерных игр.

Времена, как видим, меняются. Компьютеры пишут стихи, поэты пишут программы. И это вселяет определенные надежды.

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

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

В компьютерах с популярным микропроцессором Z80 удобно использовать для этого команды, по которым осуществляется пересылка блока памяти в ту или иную ее область. Так, например, по команде LDIR блок памяти, длина в байтах которого записана в регистровой паре ВС, переносится, начиная с адреса, помещенного в HL, в участок памяти с начальным адресом, загруженным в DE. При каждом такте операции число, занесенное в пару ВС, уменьшается на 1, а соответствующие адреса в HL и DE на 1 увеличиваются.

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

44

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

Рабочий вариант первой подпрограммы на языке IS — BASIC для компьютера Энтерпрайз имеет вид:

CODE S= HEX $ («ED, 5B, IF, 13, ED. 4B, 21, 13, ED, BO, ED, 4B, 23,13, 9, ЗА, 25, 13, 3D, 32, 25, 13, 20, EC, С9»)

Перед вызовом любой из этих подпрограмм необходимо задать начальные условия — с помощью оператора РОКЕ или другим способом. В определенные ячейки памяти вписываются: в первую пару, с начальным адресом Z1,— адрес начала копируемого фрагмента; во вторую, с начальным адресом Z2,— адрес «копии», то есть участка памяти, зарезервированного под копию этого фрагмента; в третью, с адресом Z3,— длина а копируемого отрезка строки; в четвертую, с адресом Z4,— приращение текущего адреса, равное ! — а, где I — количество байтов в строке; и, наконец, в отдельную ячейку, с адресом Z5,— количество строк Ь.

Подпрограмма работает следующим образом. При ее вызове с помощью соответствующего оператора, например, CALL USR (S, Z1) в версии IS — BASIC, в HL заносится адрес Z1. Далее числами Z2 и Z3 загружаются регистровые пары DE и ВС и осуществляется блочная пересылка. Один цикл завершен, теперь нужно выйти на

Возможные подпрограммы пересылки: Из экрана в копию Из копии в экран Коды операций

LD DE, (Z2) LD ВС, (Z3) LDIR

LD ВС, (Z4)

ADD HL, ВС

LD A, (Z5) DEC А LD (Z5), А JR NZ,—20 RET

LD DE, (Zl) LD ВС, (Z3)' LDIR

LD ВС, (Z4j EX DE, HL ADD HL, ВС

EX DE, HL LD A, (Z5J DEC A LD (Z5), A JR NZ.—22

ED 5B ZZ ZZ ED 4B ZZ ZZ ED BO ED 4B ZZ ZZ EB

09 EB

ЗА ZZ ZZ 3D

32 ZZ ZZ 20 EC (EA) C9

мерами aX b.

(ZZ ZZ—соответственно младший и старший байты адреса в шестнадцате-ричной системе счисления, ЕС и ЕА —

относительные адреса условного перехода для первой и второй подпрограмм, ЕВ — используется лишь во второй подпрограмме).

J-

О"-

- а*а--

шш

-4-

4-

+

I I I I I.....Ill......I I И I I И I I II ITTT