КАДРЫ_
GET, PUT, SPUT
MegaBasic позволяет копировать часть экранного изображения (которую мы будем называть кадром)
в свободную область памяти (далее именуемую буфером) и возвращать кадр
в прежнем или измененном виде на старое или новое место экрана.
Кадр копируется в буфер оператором
GET_m,z,n,c,h,g - а возвращается на экран оператором
PUT_m,z,n,c,h,g
Форматы операторов GET и PUT, в принципе, схожи.
Параметр m (0...6) задает принцип, по которому
кадр совмещается с изображением в буфере (GET) или на экране (PUT). При
т=0 копируемое изображение заменяет собой предыдущее. При т=1
происходит логическое сложение (OR) старого и нового содержимого; при
т=2 или 3 сложение осуществляется по принципу «исключающего
ИЛИ» (XOR). Операции, производимые при т=4, 5 и 6, аналогичны
операциям при т=0, 1 или 2, но с той лишь разницей, что при копировании
знакоместам в кадре присваиваются текущие постоянные атрибуты.
Параметр m в операторе GET обычно устанавливают
равным нулю (иные значения в фирменном руководстве даже не
упоминаются). Однако ненулевое значение m может пригодиться, если нужно
совместить в памяти изображения двух или более кадров. Нужно соблюдать
только одно условие — кадры должны быть одинакового размера.
Второй параметр (z) в операторах GET и PUT
устанавливает начальный адрес буфера, с которым взаимодействует
выделенный кадр. Нужно следить, чтобы буферы не перекрывались и,
естественно, не «наезжали» на коды MegaBasic, то есть не
оказывались выше адреса 45000.
Остальные четыре параметра задают координаты и
размеры кадра в «нормальных» знакоместах — 8x8
пикселей; начало координат — левый верхний угол экрана. Параметры
п и с указывают, соответственно, вертикальную и горизонтальную
координаты верхнего левого угла кадра. Параметры h и g определяют
высоту и ширину кадра. К их значениям в операторе PUT предъявляется
жесткое требование — они должны в точности совпадать со зна-*
°ниями параметров h и д, использованными предшествующим оператором
GET, иначе возникнут искажения изображения.
Несколько слов о рабочих и допустимых значениях
параметров. Рабочими значениями параметра m являются целые числа от 0
до 6. Но и любые другие значения не приводят к ошибке, так как
MegaBasic использует только 4 младших бита двоичного представления
целой части параметра.
Гледующий параметр — адрес буфера z
— должен указывать на свободную область памяти. Его рабочие
значения обсуждались чуть раньше. Произвольные значения также
принимаются операторами GET и PUT и пересчитываются к приемлемым для ZX
Spectrum значениям адресов. Однако трудно предположить, где окажется
буфер, если указать, к примеру, восьмизначный адрес.
Рабочие значения остальных четырех параметров
операторов GET и PUT должны быть такими, чтобы весь кадр попадал в
пределы экрана. Допустимые значения вертикальной координаты совпадают с
рабочими, а горизонтальной позволяют однократный переход правой части
кадра, не поместившегося целиком на экране, на левую сторону экрана.
Нулевых значений высоты и ширины кадра операторы GET и PUT не любят
(вплоть до зависания программы).
Прежде чем приступить к использованию оператора
GET, нужно зарезервировать с помощью CLEAR участок памяти иод буфер.
Сделать это можно и «с запасом», но в принципе минимальный
необходимый объем памяти для буфера (в байтах) легко рассчитывается. Он
равен 9-кратному произведению ширины на высоту кадра, выраженных в
«старых» знакоместах (8x8 точек).
Пример работы с операторами GET и PUT, несмотря
на свое шутливое содержание, на самом деле представляет собой весьма
практичную подпрограмму вызова оверлейного меню:
10 CLEAR 29999:FONT_1 :CURRENT_4: PAPER 0: INK 0:CLW_4,0: LET
L=4: LET S=4: LET H=12: LET
G=24:WINDOW_L,S*2,H,G*2 20 MODE_2: PRINT PAPER 0; INK 0;AT 1,16;"M E H
Ю" ' ' "На закуску — Селедочка" ' "На первое — Щи с
грибами" ' "На второе — Бифштекс по-деревенски" ' "На третье
— Бланманже" ' ' "Напитки в ассортименте" 30 PAPER
7:GET_4,30000,L,S,H,G
40 CURRENT_2:MODE_4:STIPPLE_W: FOR N=1 TO 30: PRINT INK
(1+RND*6);"y>Ke несут меню!": NEXT N 50 LET L1=1+RND*4: LET S1=1+RND*4:GET_0.35200fL1fS1lHlG 60 PUT_0,30000,L1,S1fH,G: PAUSE 500 70 PUT_0,35200,L1 ,S1 ,H,G 80 PAUSE 120: GO TO 40
В MegaBasic существует еще один оператор
(SPUT), который как и PUT, переносит кадр из буфера на экран. Но делает
он это с изменением масштаба. Оператор SPUT тянет за собой рекордное
количество параметров — целых семь:
SPUT_z,x,y,u,v,g,h
Некоторые из параметров совпадают с параметрами
операторов GET и PUT, другие напоминают параметры SPRINT (см. стр.
208). Первый параметр (z) указывает адрес буфера. Параметры х и у
задают координаты размещения верхнего левого угла кадра на экране.
Координаты указываются не в знакоместах, как для предшествующего
оператора GET, а в пикселях (за начало координат принимается верхний
левый угол экрана). Следующие два параметра оператора SPUT (и и v)
определяют масштабы увеличения выводимого изображения, соответственно,
по горизонтали и вертикали. Наконец, параметры g и h,
как и в операторах GET и PUT, определяют размер (высоту и длину)
исходного кадра Нов операторе SPUT они задаются необычным образом: в то
время как g указывается в знакоместах, h
задается в пикселях, то есть в 8 раз превышает значение, подставленное
в предшествующий оператор GET. Оператор SPUT всегда выводит изображение
в постоянных атрибутах, то есть так, как если бы в операторе PUT
использовался режим т=4.