Диалекты бейсика для ZX Spectrum 1992 г.

Спектрум Бейсик - Целочисленные компиляторы - ZX-Compiler, MCoder, Softek IS.


ЦЕЛОЧИСЛЕННЫЕ КОМПИЛЯТОРЫ

ZX-Compiler

ZX-Compiler v. 1.026 — один из первых компиляторов Spectrum-Бейсика, почти ровесник Speccy. Он также известен под именем Integer Compiler, или просто Compiler.

После загрузки программа предложит нажать любую клавишу, и если последовать ее совету, то автоматически выполнится оператор NEW: картинка пропадет, и на экране появится строчка

© 1982 Sinclair Research Ltd.

Эта особенность загрузки ZX-Compiler обычно вводит в заблуждение неопытных программистов, которые воспринимают ее как сброс компьютера. В действительности же все идет по плану: область бейсик-программы очистилась от загрузчика, а собственно компилятор остался в неприкосновенности27.

Оператор NEW можно выполнять и самостоятельно для быстрого удаления текста исходной бейсик-программы. При этом и компилятор, и скомпилированная программа остаются нетронутыми.

После загрузки компилятор с пакетом рабочих процедур располагается в памяти с адреса 59990 по 63590. Содержимое этой области изменять нельзя.

Исходный текст программы на Бейсике вводится обычными способами: с клавиатуры, с ленты, с диска. Бейсик-программу можно редактировать, запускать на исполнение и т. п. Присутствие в памяти компилятора никак не отражается на работе интерпретатора Spectrum-Бейсика, если не считать некоторого уменьшения объема доступной ему памяти.

Объемы исходного бейсиковского текста и скомпилированной программы задаются установкой RAMTOP. Напомним, что эта системная переменная ограничивает «сверху» область, предназначенную для бейсик-программы. С другой стороны, значение RAMTOP, увеличенное на единицу, определяет адрес, с которого после компиляции будет размещена скомпилированная программа (см. табл. 3 на стр. 121). Заранее (то есть до компиляции) трудно подобрать оптимальное расположение,RAMTOP, так как предсказать в точности размер скомпилированной программы практически невозможно. Обычно он близок к размеру исходного текста, несколько превышая его. Поэтому первоначально ZX-Compiler устанавливает RAMTOP на адрес 39999. При необходимости значение RAMTOP в любой момент можно изменить обычным способом, введя с клавиатуры оператор:

CLEAR ADDR

- где ADDR — требуемое значение RAMTOP.

При завышенном значении RAMTOP может возникнуть ситуация, когда оттранслированной программе не будет хватать отведенного для нее места. В этом случае компилятор прервет работу и выдаст сообщение:

Out of memory

Попробуем скомпилировать бейсик-программу с большим временем выполнения, например:

10 CLS

20 FOR А=0 ТО 175

30 FOR В=0 ТО 255

40 PLOT В, А

50 NEXT В: NEXT А

Эта программа последовательно, точка за точкой, закрашивает экран цветом тона. Нужно запастись достаточным терпением, чтобы, запустив ее оператором RUN, дождаться сообщения 0 ОК. Прибегнем к помощи компилятора.

Запускается ZX-Compiler оператором

RANDOMIZE USR 60000

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

В процессе каждого прохода на экран выводится текст исходной программы. После успешного завершения первого прохода необходимо нажать любую клавишу (кроме Space). Нажатие Space или Break (CS/Space) прервет процесс, и компьютер перейдет в режим интерпретатора.

Компиляция сопровождается также отображением в верхней части экрана адреса окончания скомпилированной на данный момент части программы. Это число достигает своего максимального значения в конце второго прохода.

Итак, компиляция нашего примера успешно завершилась сообщением О ОК.

По адресу конца скомпилированной программы (для рассматриваемого примера он равен 401 23) можно рассчитать ее длину:

401 23—(RAMTOP+1)

Подставив значение RAMTOP, равное 39999, получим число 123. Для сравнения, исходная программа на Бейсике вместе с переменными занимает 117 байт.

Запускается скомпилированная программа оператором

RANDOMIZE USR (RAMTOP+1)

Для запуска нашего примера введем с клавиатуры RANDOMIZE USR 40000

Не правда ли, впечатляющее зрелище? Программа, на выполнение которой интерпретатору требовалось почти 6 минут, в скомпилированном виде выполняется за 22 секунды!

Да, действительно, целочисленные компиляторы, к которым относится ZX-Compiler, обеспечивают поистине фантастическую скорость выполнения операций. Кроме того, приведенный пример не может в полной мере продемонстрировать эффективность компилятора, так как скорость выполнения программ, использующих вывод на экран графики, сильно ограничена быстродействием подпрограмм ПЗУ. Трансляция программ, выполняющих только арифметические операции, дает гораздо больший выигрыш во времени. Например, следующая программа:

10 LET С=0 20 FOR А=0 ТО 175 30 FOR В=0 ТО 255 40 LET С=С+1 50 NEXT В: NEXT А

после компиляции будет работать уже более чем в 80 раз быстрее оригинала!

Однако за такую высокую скорость приходится дорого расплачиваться: ZX-Compiler предъявляет довольно жесткие требования к исходному тексту программы.

После включения в текст программы, например, оператора DIM А(10), на первом же проходе компилятор с недовольным гудением остановит трансляцию и выдаст сообщение Nonsense in BASIC, указав место ошибки мигающим знаком ?. Программный курсор в этом случае расположится в строке, содержащей ошибку, так что для вызова ее на редактирование достаточно будет нажать Edit (CS/1).

Существует ряд корректных с точки зрения стандартного Бейсика операторов и функций, компиляцию которых ZX-Compiler не поддерживает. Их исчерпывающий перечень приведен в Приложении 1. Здесь лишь пробежимся по этому списку.

Разумеется, не поддерживаются функции, возвращающие, в общем случае, нецелочисленный результат (SIN, COS, TAN, ASN, ACS, ATN, LN, EXP), а также вызов числа PI. Исключением является функция SQR, но при ее расчете отбрасывается дробная часть результата. То же самое происходит и при выполнении операции деления. Не допускается использование в исходном тексте операции возведения в степень и функций, определяемых пользователем (DEF FN, FN).

Не поддерживается работа с символьными переменными, и, следовательно, нельзя включать в текст бейсик-программы функции VAL, VAL$, SCREEN), LEN, STR$ и оператор INPUT с ключевым словом LINE. Опрос клавиатуры с помощью функции INKEYJ в таком случае возможно реализовать только «в тандеме» с функцией CODE, например:

LET с = CODE INKEY$

PRINT CODE INKEY$

He допускается работа с массивами, как числовыми, так и символьными, вне зависимости от их размерности.

Запрещено применение операторов GO ТО и GO SUB с переменной или выражением в качестве параметров. Номер строки, к которой осуществляется переход, можно указывать только в явном виде — числом.

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

CIRCLE X, (Y+16). 10

или

PRINT AT (А+1), (2*8)

Не поддерживаются логические операции (NOT, OR, AND).

Функция RND генерирует значения в диапазоне от 0 до 32767.

Оператор STOP, независимо от его местонахождения в программе, трактуется как ограничитель текста программы. Весь текст после этого оператора при компиляции игнорируется.

Запрещены операторы SAVE, LOAD, CONTINUE, CLEAR, LIST, NEW, RANDOMIZE.

Результат функции USR с символьным аргументом выдается в скомпилированной программе в так называемом «дополнительном коде» в диапазоне от -32768 до +3276728. Например, оператор PRINT USR "А" выводит на первый взгляд странный результат: -168 (вместо привычного 65368). Для чисел в диапазоне от 0 до 32767 дополнительное представление числа совпадает с обычным. Для чисел в диапазоне от 32768 до 65535 пересчет из одной формы в другую следует производить по формулам:

N1 =N2-65536 (N2=32767...65535)

N2=N1+65536 (N1=—32768...0)

- где N1 — дополнительное представление числа N2. Функция USR с символьным аргументом — это единственный случай, когда приходится помнить об этом, поскольку для инструкций РОКЕ и РЕЕК, а также для USR с числовым аргументом допустимо указывать значения аргументов как в обычном, так и в дополнительном представлении.

Операторы READ и DATA работают без особенностей, однако RESTORE употребляется только с параметром.

Все компиляторы Spectrum-Бейсика позволяют включать в текст компилируемой программы обращения к подпрограммам в машинных кодах, осуществляемые с помощью функции USR. Однако поскольку ZX-Compiler не поддерживает оператор RANDOMIZE, а также не допускает использования выражений в качестве параметров операторов GO ТО и GO SUB, наиболее часто употребляющиеся формы RANDOMIZE USR <адрес>, GO ТО USR <адрес) и GO SUB USR < адрес> трактуются как ошибочные. Приходится использовать другие операторы, например:

PRINT USR < адрес >

LET N—USR < адрес >

Здесь нелишне напомнить, что функция USR при использовании ее для обращения к процедурам в машинных кодах возвращает интерпретатору содержимое регистровой пары ВС, которое воспринимается как параметр оператора, предшествовавшего USR. Так, оператор LET N=USR <адрес) присвоит переменной N значение, содержащееся в регистровой паре ВС, оператор PRINT USR выведет его на экран и т. п.

Несмотря на то, что ZX-Compiler по природе своей может работать только с целыми числами, все же для параметров оператора ВЕЕР он делает исключение. Ведь использование ВЕЕР теряет смысл, если, например, длительность звука нельзя сделать меньше секунды. Поэтому ZX-Compiler позволяет задавать параметры ВЕЕР в виде натуральных дробей, например, так:

ВЕЕР 1/10, (п+1/8)

У читателя может возникнуть вопрос: «Стоит ли вообще пользоваться таким компилятором, как ZX-Compiler?» Действительно, нужен ли этот самый старый, самый «ограниченный» и не самый быстродействующий компилятор? Все перечисленные недостатки можно простить за одно лишь достоинство ZX-Compiler, которое в некоторых случаях может оказаться решающим: он занимает в памяти почти в два раза меньше места (всего 3600 байт), чем наименьший из других компиляторов, описываемых в этой книге.

О том, как записать скомпилированную программу на внешний носитель и снабдить ее программой-загрузчиком, то есть сделать из нее законченный программный продукт, будет сказано в разделе, специально посвященном этому вопросу (см. стр. 120).

MCoder 2

Компилятор MCoder 229 — вторая версия ZX-Compiler, значительно превосходящая своего предшественника. Основным и неоспоримым достоинством MCoder 2 является возможность работы с одномерными числовыми массивами и символьными переменными. В остальном список особенностей компилятора почти совпадает с соответствующим списком ZX-Compiler Подробно — в Приложении 1):

• не поддерживаются математические функции SIN, COS, TAN, ASN, ACS, ATN, LN, EXP, PI, функции VAL, VAL$ и функции, определяемые пользователем (DEF FN, FN);

• недопустимо использование переменных или выражений в операторах GO ТО и GO SUB;

« допускаются все варианты применения функции USR для вызове внешних процедур в машинных кодах, кроме GO ТО USR < адрес) и GO SUB USR <адрес>;

• выражения, используемые в качестве параметров операторов PLOT, DRAW и CIRCLE должны быть заключены в круглые скобки;

• не поддерживаются логические операции (NOT, AND30, OR);

• оператор STOP рассматривается как ограничитель текста программы, и весь последующий текст игнорируется;

• не поддерживаются операторы SAVE, LOAD, CONTINUE, LIST, NEW, а также CLEAR с параметром;

• операторы READ и DATA работают, как в стандартном Бейсике, однако RESTORE не может употребляться без параметра;

• в параметрах ВЕЕР можно использовать натуральные дроби.

После загрузки компилятора RAMTOP устанавливается на адрес 39999. В процессе работы значение RAMTOP можно изменять оператором CLEAR <новое значение). Скомпилированная программа размещается с адреса RAMTOP+1.

Компиляция запускается оператором RANDOMIZE USR 60000 и осуществляется в два прохода. Дополнительным удобством является то, что по окончании работы компилятор выводит на экран информацию о длине скомпилированного кода.

Скомпилированная программа запускается оператором RANDOMIZE USR (RAMTOP+1)

MCoder 2 позволяет ускорить работу программ обычно в 60...90 раз, что несколько превосходит показатели ZX-Compiler v. 1.0. Лучшие результаты получаются при использовании в программе только арифметических действий, без вывода графики.

Softek IS

Компилятор Softek IS31 по сравнению с ZX-Compiler не только накладывает на текст исходной бейсик-программы меньше ограничений, но и добавляет несколько новых инструкций, отсутствующих в Spectrum-Бейсике. Кроме того, он значительно увеличивает скорость выполнения скомпилированной программы. Тест-программа:

10 LET С=0 20 FOR А=0 ТО 175 30 FOR В=0 ТО 255 40 LET С=С+1 50 NEXT В: NEXT А

после обработки компилятором Softek IS ускоряет свою работу более чем в 95 раз. Правда, за это пришлось заплатить почти двукратным (по сравнению с ZX-Compiler v. 1.0) увеличением объема самого компилятора, который составил 6 килобайт.

Процедура запуска Softek IS выполнена несколько иначе, чем ZX-Compiler. После окончания загрузки компилятор запрашивает адрес, по которому требуется разместить скомпилированную программу:

RAMTOP at 40000? (Y or N)

После утвердительного ответа значение системной переменной RAMTOP устанавливается равным 40000, выполняется оператор NEW и управление передается интерпретатору Бейсика. При отрицательном ответе программа запрашивает новое значение RAMTOP, ввод которого завершается клавишей Enter. Значение RAMTOP,'а следовательно, и адрес размещения скомпилированной программы можно изменить в процессе работы оператором CLEAR (более подробно об этом см. стр. 106).

Ввод программы, предназначенной для компиляции, ее редактирование и отладка ничем не отличаются от обычной работы в Spectrum-Бейсике.

Запускается компиляция оператором RANDOMIZE USR 59300

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

Компиляция осуществляется в два прохода, сопровождающихся, соответственно, сообщениями:

FIRST PASS SECOND PASS

После успешного завершения компиляции на экран выдается привычное

ООК и текст

NO ERRORS

В случае обнаружения недопустимой для Softek IS конструкции компиляция прерывается с сообщением ERROR и на экран выводится участок программы, непосредственно предшествующий ошибке. Место сбоя отмечается мигающим знаком ?. Как и в ZX-Compiler, программный курсор автоматически устанавливается на «дефектную» строку программы.

Ограничения в использовании операторов и функций Spectrum-Бейсика частично совпадают с ограничениями, накладываемыми ZX-Compiler (но есть и отличия):

• не поддерживается работа с массивами;

• допустимы все формы обращения к внешним подпрограммам в машинных кодах, кроме GO ТО USR <адрес) и GO SUB USR <ад-рес>;

• все ограничения, касающиеся использования функций при работе с ZX-Compiler, справедливы и для Softek IS: не поддерживаются математические функции SIN, COS, TAN, ASN, ACS, ATN, PI, LN, EXP и, в отличие от ZX-Compiler, SQR, а также VAL, VAL$, LINE и функции, определяемые пользователем;

• допустимы операции с символьными переменными, в связи с чем возможно использование функций STR$, LEN и SCREENS, а также INKEY$;

• не поддерживаются операторы MERGE, CONTINUE, LIST, NEW;

• использование SAVE, LOAD, VERIFY допустимо только при операциях с файлами типа CODE;

• оператор CLEAR может быть использован в программе только без параметра;

• выражения, используемые в качестве параметров операторов, не обязательно заключать в скобки;

• допустимы логические операции NOT, AND, OR, однако многоуровневое их вложение может привести к ошибке;

• операторы READ и DATA выполняются, но требуют наличия в программе хотя бы одного оператора RESTORE (с аргументом или без него), предшествующего первому оператору READ.

Дополнительные операторы, распознаваемые Softek IS, но отсутствующие в Spectmm-Бейсике, вводятся в текст исходной программы вслед за оператором REM. Они составляются из прописной буквы (идентификатора оператора) и списка параметров.

REM В

останавливает работу скомпилированной программы, если в момент его выполнения нажата клавиша Break (CS/Space).

REM S, A, x, у

выводит символ на экран с точностью до пикселя. Параметры: А — код символа, х (0...175) и у (0...255) — расстояния в пикселях от левого нижнего угла основного экрана. При выходе за пределы экрана печать продолжается с его противоположной стороны. Все параметры могут быть переменными или выражениями.

Приведем пример вывода на экран символьной переменной:

10 LET В=80

20 LET W$="Softek IS v1.2" 30 FOR A=1 TO 14 40 LET B=B+1

50 REM S, CODE W$(A), A*7, В 60 NEXT A

Естественно, увидеть что-нибудь на экране можно будет только после компиляции этой программы (см. рис. 6): интерпретатор воспримет REM S как REM и только.

Оператор REM S может быть очень полезен при использовании набора узких символов (например, 4x8 пикселей). Тогда можно обеспечить вывод на экран более 32 символов в строке и без применения специального драйвера.

REM S имеет одну интересную особенность — он способен выводить на экран не 96 символов (коды от 32 до 127), как это принято для операторов печати Spectrum-Бейсика, а 256. Дополнительные символы хранятся в обычном формате (по 8 байт на символ) в нескольких областях памяти, положение которых определяется, исходя из значений системных переменных CHARS (23606/07) и UDG (23675/76):

• символы с кодами от 0 до 31, которым в стандарте ASCII соответствуют управляющие коды, считываются с адреса, хранящегося в CHARS, и занимают 256 байт;

• символы с кодами от 32 до 127 — с адреса (CHARSJ+256 и занимают положенные им 768 байт до адреса (CHARS)+1023 включительно, как обычный символьный набор;

• символы с кодами от 143 до 255, которым в системе ZX Spectrum соответствуют ключевые слова Бейсика, располагаются в памяти с адреса (UDG)-8 по адрес (UDG)+895;

• и, наконец, символы с кодами от 128 до 142 (в обычных условиях — символы псевдографики) формируются из данных, записанных в области памяти, начиная с адреса (UDG)+1920 по (UDG)+2039.

Рис. 6. Пример работы оператора REM S.

Знание последней особенности дает возможность использовать в скомпилированных программах альтернативный символьный набор из 128 символов совместно с 128 символами UDG, один раз прибегнув к модификации системных переменных UDG и CHARS. Следует подчеркнуть, что эти особенности присущи только оператору REM S, но не относятся к стандартным операторам вывода на экран (PRINT CHR$).

REM М, Ai. А2, ..., An

включает в скомпилированную программу фрагмент в машинных кодах: А1, А2 и т. д. (целые числа от 0 до 255). Для успешного возврата из процедуры в кодах она должна заканчиваться кодом 201 (RET). Оператор REM М позволяет писать наиболее критичные по времени выполнения фрагменты программы непосредственно в машинных кодах, что значительно расширяет сферу применения компилятора Softek IS.

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




СОДЕРЖАНИЕ:
  1. Laser Basic - Вывод спрайтов на экран; Вывод на экран части спрайта; Перенос атрибутов; Преобразование окна экрана; Наборы переменных; Перемещение спрайтов; Наложение спрайтов; Копирование изображения с экрана в спрайт; Преобразование спрайтов; Скроллинг пейзажа; Изменение размеров области спрайт-файла; Вспомогательные графические операторы и функции; Определение столкновений спрайтов; Сервисные операторы и функции; Процедуры; Загрузка и запись программ.


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Софт - Прошлое, настоящее и будущее ZX WINDOWS.
Разное - перспективы: игра Экспансия.
Новости - причины перерыва в выпуске газеты, список иногородних спектрумистов побывавших в Коврове.
Обзор новья - Don News 15, Lamergy 1, ZX Rulem, New Puzzle, Trouble v0.2, ASM to PT, Real Audio Player, Mini Games Collection.
BBS - список станций BBS ZXNet.

В этот день...   29 марта