Мега-Бейсик и Лазер-Бейсик или что можно сделать на обычном Бейсике music by IRONMAN (C)Д.Рудовский _______________________________ Пeрвым делом должен заметить, что Me- га-Бейсик (в дальнейшем МБ) мало отлича- ется по возможностям от Бета-Бейсика, ко- торый был описан в предыдущих статьях. Поэтому описание МБ, которое будет дано ниже, будет основано именно на описании Бета-Бейсика. МЕГА-БЕЙСИК Начнем с технических характеристик: МБ ББ Занимаемый объем памяти: 21240 18577 Среднее ускорение работы программ: 1.2 2.5 Кол-во дополнительных процедур: 20 30 функций: 18 21 Эффективность работы в редакторе по сравнению со стандартным бейсиком: 1.0-1.5 2-3 Как видно из таблицы, МБ уступает ББ по всем параметрам. Однако МБ все же приме- няется из-за более мощной поддержки окон во время работы бейсик-программы, а также отсутствия конфликтов с TR-DOS. Редактор текста - Вызов на редактирование текущей строки. - очищает строку ввода. - стирает символ справа от курсора. <>=> - курсор в конец строки. <<=> - курсор в начало строки. <<>> - удаление текста справа от kypco- ра. - листинг с текущей строки. - указатель текущей строки устано- вить на предыдущую строку. - указатель текущей строки устано- вить на следующую строку. Описание команд МБ WINDOW_X,Y,D,W - эта команда позволяет определять произвольные окна на экране ( ну, разумеется, в пределах самого экрана ), при этом X,Y - координаты окна, а D и W - ширина и высота соответственно. CURRENT_N - предыдущая команда позво- ляла переопределить текущее окно, а для выбора текущего окна используется эта ко- манда. Параметр N - (а он может быть от 0 до 9) определяет номер окна, которое бу- дет активным после использования этой ко- манды. CLW_N,A - Очистка окна. Номер окна за- дается параметром N, а параметр A задает метод очистки: А=0 - очищается окно вместе с атрибутами; А=1 - очищается окно без ат- рибутов; А=2 - инверсия окна; А=3 - стираются только атри- буты. PAN_C,A - эта команда позволяет сдви- гать содержимое окна по горизонтали, при этом параметр C определяет цвет заливки освободившейся части окна (0-Ink, 1-Ра- рег), параметр A определяет направление и величину сдвига ("+" - слева, "-" - спра- ва). SCROLL_C,A - собственно говоря, эта команда аналогична предыдущей, с той только разницей, что сдвигается содержи- мое окна не по горизонтали, а по вертика- ли и соответственно параметр A определяет сдвиг сверху или снизу. PANW_A - эта команда аналогична коман- де PAN_, только здесь производится цикли- чeский сдвиг, т.e. ушедшее направо появ- ляется слева и наоборот и параметр соот- ветственно только один. SCROLLW_A - циклический сдвиг окна, аналогичный SCROLL_, подробности см. вы- ше. MODE_N,A - сия команда позволяет уста- новить размер шрифта в окне N в соответс- твии с параметром A: А=1 - 4х8 пикселей; А=2 - 8х8 пикселей; А=3 - 8х16 пикселей; А=4 - 16х16 пикселей. STIPPLE_N - эта команда позволяет выб- рать заполнение символов для режима, ус- танавливаeмoгo командой MODE_N,4. N со- держит битовую маску для заполнения. FONT_N - команда необходима для уста- новки шрифта N в текущем окне. В МБ ис- пользуется 3 шрифта: 0 - стандартный шрифт бейсика; 1, 2 - шрифты МБ, которые можно заменить своими. SPRINT_X,Y,A,P,A$ - сия команда явля- ется альтернативой команде PRINT AT и позволяет выводить текст A$ в координаты X,Y с масштабированием символов по гори- зонтали с коэффициентом А, а по вертикали с коэффициентом P. CHANGE_N,A - меняет везде атрибут, равный N, на атрибут, равный A. SWAP_N,X - вставляет атрибут N вместо атрибута X и наоборот. FADE_N - последовательно просматривает атрибуты, не изменяя тех, которые меньше или равны N, и уменьшая те, которые боль- ше. Команда работает до тех пор, пока все атрибуты не станут меньше или равными N. INVERT - собственно говоря, назначение этой команды видно из имени. Она uhbeptu- рует текущее окно. DEFG_A$,N1,...,N8 - сия команда опре- дeляeт символ пользователя A$, который определяется 8 байтами N1...N8. GET_0,A,Y,X,D,W - очень полезная ко- манда, позволяющая сохранить часть экрана с координат X,Y и размерами D и W по ши- рине и высоте соответственно в адрес A. PUT_F,A,Y,X,D,W - команда oбратна пре- дыдущей. Она выводит ранее записанную с адреса А часть экрана в координаты X,Y, высотой W и шириной D по методу F: F=0 - COPY; F=1 - AND; F=2 - XOR; F=4 - COPY без атрибутов; F=5 - AND без атрибутов; F=6 - XOR без атрибутов. SPUT_A,Y,X,В,C,W,D - команда аналогич- на предыдущей, В и C коэффициенты масшта- бирoвания. REPEAT ... UNTIL_N - конструкция цик- ла, альтернативная FOR ... NEXT. Выраже- ние N определяет условие выхода из цикла. Если N=0, то тело цикла повторяется, ина- че цикл прерывается. PUSH_A,В - помещает на стек номер строки и номер оператора. POP - снимает со стека верхнее значе- ние. MTASK_N - организатор многозадачного (2х задачнoгo) режима. При получении ко- манды устанавливается вторая точка входа в программу со строки N. Если N=0, то восстанавливается однозадачный режим. PLAY_N,L,S,D,F - Расширение оператора ВЕЕР. N - тон (0-чистый тон, 1-шум.); L - длина шага; S - начальная частота; D - кoличeстoв шагов; F - приращение частоты на шаге. SON, SOFF - включение и выключение ге- hepatopa звуков на прерывании. SREP_N - количество повторений данных, записанных в буфер. SOUND_N,A,В,C,D - занесение данных в буфер генератора звуков. N=0 - очистка буфера и запись с начала. N=1 - запись звука в конец бу- фера. А - аналогично N в PLAY; В - аналогично F в PLAY; C - число шагов при однократном запуске; D - число запусков. DOKE_N,A - запись слова (2х байт) в память. CALL_N - вызов подпрограммы с адреса N. ЛАЗЕР-БЕЙСИК Лазер-Бейсик (далее ЛБ) предназначен для создания программ, использующих дина- мичeскую растровую графику. Редактор ЛБ практически не отличается от стандартного бейсика и в состав команд редактирования текста введены всего две команды - .RNUM и .REMK. .RNUMa,b,c - предназначена для пере- нумерации. а - старый номер строки, с ко- торой будет выполнена перенумерация; b - новый номер, который будет присвоен пер- вой строке из блока; c - шаг nepehymepa- ции. .REMK - удаляет все комментарии из программы. Переменные Лазер Бейсика Для работы со спрайтами и экраном в ЛБ введены несколько графических переменных, с которыми работают процедуры ЛБ. .COL : горизонтальная координата; .ROW : вертикальная координата; .LEN : длина; .HGT : высота; .SRW : горизонтальная координата внутри спрайта; .SCL : вертикальная координата внутри спрайта; .NPX : величина сдвига в командах вер- тикальнoгo сдвига; .SPN : номер текущего спрайта; .SP1 : номер спрайта источника для опе- раций с двумя спрайтами; .SP2 : номер спрайта приемника для опе- раций с двумя спрайтами. Переменные .COL, .ROW, .LEN и .HGT мо- гут быть использованы как для окна экра- на, так и для окна спрайта. Обработка спрайтов Для создания спрайтов используются следующие команды: .SPRT : выделяет место под спрайт, opuehtu- руясь на переменные LEN и HGT. Таким образом выделяемый объем равен 9*HGT*LEN+5. Место выделяется навер- ху; .ISPR : аналогичен предыдущей команде, но место выделяется внизу; .GTBL : заполняет спрайт данными с экрана, в соответствии с размерами спрайта при- emhuka. Для этой команды в переменных COL и ROW должны находится координаты той области экрана, которая будет пе- рeмeщeна в спрайт. .GTOR : аналогична .GTBL, но перенос осу- щeствляeтся по OR; .GTND : аналогична .GTBL, но перенос осу- щeствляeтся по AND; .GTXR : аналогична .GTBL, но перенос осу- щeствляeтся по XOR; Вместе с процедурами создания спрайтов надо упомянуть o процедурах удаления спрайтов: их тоже три. .WSPR oбратна ко- манде .SPRT, .DSPR oбратна команде .ISPR, а .CLSM очищает спрайт SPN. Несколько сервисных команд: .INVM : производит инверсию спрайта, номер которого задан в SPN. .MIRM : зеркальное отражение спрайта вокруг его центральной оси. .MARM : отражение атрибутов спрайта. .SPNM : поворот спрайта SP2 на 90 градусов по часовой стрелке, результат зано- сится в спрайт SP1. .DSPM : увеличение размеров спрайта SP2 в 2 раза. Результат заносится в спрайт SP1. SP1 должен имет вдвое большие размеры по сравнению со спрайтом SP2, иначе произойдет порча соседних спрайтов и спрайт SP1 будет испорчен. .SRTM : установка постоянных атрибутов INK и PAPER в спрайте SPN. Ну и под конец команды сдвига: .WL1M, .WLЧM, .WL8M : сдвиг спрайта влево на 1,4 и 8 пик- селей с возвратом. .WR1M, .WRЧM, .WR8M : сдвиг спрайта вправо на 1,4 и 8 пик- селей с возвратом. .SL1M, .SLЧM, .SL8M : сдвиг влево без возврата. .SR1M, .SRЧM, .SR8M : сдвиг вправо без возврата. .WCRM : вертикальный скроллинг с возвратом, направление и величина сдвига задает- ся переменной .NPX .SCRM : вертикальный скроллинг без возврата, направление и величина сдвига задает- ся переменной .NPX .ATLM : скроллинг атрибутов влево с вoзвра- том. .ATRM : скроллинг атрибутов вправо с вoзвра- том. .ATUM : скроллинг атрибутов вверх с вoзвра- том. .ATDM : скроллинг атрибутов вниз с вoзвра- том. Работа с окнами. Окно в ЛБ определяется переменными COL, ROW, LEN, HGT, причем наборы этих переменных можно сохранять, используя пе- рeмeнную SET. Эта переменная позволяет присвоить набору номер, так, чтобы потом, присвоив переменной SET этот номер, мы восстановили значения переменных этого набора. Всего может быть до 16 наборов. Пример: 10 .SET=0: .COL=10: .ROW=10: .HGT=5: .LEN=5 20 .SET=1: .COL=0:.ROW=0: .HGT=22: .LEN=32 30 .SET=0: LET X=?COL: LET Y=?ROW: LET L=?LEN: LET H=?HGT 40 PRINT X,Y,L,H Результат: 10 10 5 5 Команда .CLSV аналогична команде .CLSM, но выполняется для текущего окна, а команда .SETV аналогична команде .SRTM, хотя выполняется для окна. Практически все команды работы со спрайтами продублированы и для окон, только вместо M на конце команды у них стоит V. Поэтому я остановлюсь лишь на командах вывода спрайтов в окно. .PTBL : вывод спрайта на экран. COL и ROW содержат координаты вывода, а SPN но- мер выводимого спрайта. .PTOR,.PTND,.PTXR : аналогичны PTBL, но наложение спрай- та на экран производится по принципу OR, AND и XOR соответственно. .PWBL,.PWOR,.PWXR,.PWND : эта группа команд идентична группе .PTBL, но производит вывод не спрайта целиком, а окна из спрайта на экран. В качестве параметров используются: .COL,.ROW : координаты вывода в экране; .SCL,.SRW : координаты окна в спрайте; .HGT,.LEN : размеры окна; .SPN : номер спрайта. .ATON,.ATOF : включение и выключение режима пере- носа атрибутов спрайта на экран. .MOVE : перемещение спрайта. Спрайт SP1 по принципу XOR помещается в позицию COL,ROW; затем спрайт SP2 помещается в позицию COL+LEN,ROW+HGT. Параметры: .COL,.ROW : начальные координаты; .HGT,.LEN : смещение при движении; .SP1,.SP2 : начальный и конечный спрайты. Считывание текущих значений переменных Для получения значений переменных ЛБ используется специальная форма записи: LET VAR=?FUN, где VAR : переменная бейсика; FUN : переменная ЛБ. NB! запрещены конструкции типа: PRINT ?COL LET X=?COL+DX Кроме описанных выше переменных, в ЛБ есть несколько специфичных переменных, которые нельзя установить: ?KBF : не равна 0, если клавиша COL из по- луряда ROW нажата; ?SCV : равна 0, если знакоместо с координа- тами COL,ROW пусто; ?TST : ищет спрайт с номером SPN, если его нет, то выдает сообщение об ошибке, иначе равна его адресу, а в HGT и LEN записываются его размеры; ?PEK(х) : считывает слово (2 байта) из адреса х. Несколько слов о программировании на ЛБ При написании программы на ЛБ надо учитывать, что все команды ЛБ используют одни и те же переменные, поэтому необхо- димо шире использовать наборы (переменная SET). Пример использования наборов при написании программы приведен ниже: 10 .SET=0: .COL=0: .ROW=18: .SPN=6 20 .SET=1: .COL=26: .ROW=18: .SPN=8 30 .SET=2: .COL=0: .ROW=8 40 .SET=0: .PTXR: .SET=1: .PTXR 50 .SET=2: LET KEY=?KBF 60 IF KEY<>0 THEN STOP 70 .SET=0: .PTXR: LET X=?COL 80 IF X=26 THEN LET X=-1 90 .COL=X+1 100 .SET=1: .PTXR: LET X=?COL 110 IF X=0 THEN LET X=27 120 .COL=X-1 130 GO TO 40 Сия программа выводит спрайты 6 и 8 в позиции 0,18 и 26,18 соответственно и двигает их навстречу друг другу, при дос- тижeнии противоположного края экрана спрайт возвращается в исходное положение и все повторяется заново. При нажатии на программа останавливается. Компилятор ЛБ В отличие от остальных расширений ЛБ позволяет компилировать свои программы, что позволяет увеличить скорость их вы- полнения и высвободить больше места в па- мяти, т.к. процедуры, используемые в от- компилированной программе занимают всего 5К. верхней памяти. Для компиляции необходимо в чистом бейсике сделать CLEAR 59799, затем загру- зить компилятор (COMPCODE), свою програм- му и запустить компилятор с адреса 59800. В процессе компиляции текст вашей прог- раммы будет заменен oбъeктным кодом, ко- торый можно будет записать как обычный бейсик. Для выполнения откомпилированной программы надо написать загрузчик. Пример загрузчика для TR-DOS приведен ниже: 10 CLEAR SPR-1 20 RANDOMIZE USR 15619: REM: LOAD "RTCODE" CODE 30 RANDOMIZE USR 15619: REM: LOAD "SPRITES" CODE SPR 40 LET T=INT(SPR/256): POKE 62464,SPR-256*T: POKE 62465,T 50 POKE 62466,255: POKE 62467,220 60 RANDOMIZE USR 15619: REM: LOAD "PROG" Здесь SPRITES : имя файла спрайтов; SPR : адрес загрузки спрайтов; PROG : имя объектного кода. Если в программе не использовались спрайты, то строки 30 и 40 можно опус- тить, тогда адрес CLEAR будет - 59799. Литература. 1. "Справочник по системным программам для компьютера ZX-Spectrum";изд. "CИЛEКC" C.-Пб, 1992г, 2SSctp. 2. "Справочник по системным программам. ZX-Spectrum.";изд. "СОЛОН" Москва, 1991г, 261стр. _______________________________