Техника - молодёжи 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
|