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

Спектрум Бейсик - Компиляторы, работающие с вещественными числами: Softek FP, Tobos FP.


КОМПИЛЯТОРЫ, РАБОТАЮЩИЕ С ВЕЩЕСТВЕННЫМИ ЧИСЛАМИ

Softek FP

Компилятор Softek FP32 (Softek Floating Point), известный также под именем Full Compiler, разработан тем же автором, что и Softek IS, и внешне напоминает последний. По-видимому, изначально Softek IS и Softek FP составляли нечто вроде программного пакета, предназначенного для ускорения работы различных бейсик-программ. Причем там, где была необходима максимальная скорость, но не требовалось особо сложных математических вычислений, рекомендовалось использовать Softek IS, а в остальных случаях мог быть использован Softek FP, работающий несколько медленнее, зато позволяющий обрабатывать как целые, так и вещественные числа.

Две версии этого компилятора — Full Compiler v. 1Л и FP48K v.1.7 — не слишком сильно отличаются друг от друга. Full Compiler v. 1.1 состоит из бейсик-загрузчика и файла в машинных кодах. FP48K v.1.7 состоит из трех файлов: загрузчика, фирменной заставки Softek FP и блока кодов собственно компилятора. Версия 1.1 по окончании загрузки, как и Softek IS, запрашивает значение RAMTOP, однако после его ввода не происходит очистки области Бейсика оператором NEW, поэтому перед началом работы необходимо сделать это вручную. Оригинальная версия 1.7 устанавливает RAMTOP на адрес 39999 без запроса и выполняет оператор NEW автоматически (в дисковой версии 1.7 в'зод значение RAMTOP и выполнение NEW необходимо сделать вручную). Значение RAMTOP всегда можно изменить оператором CLEAR <адрес) f где <адрес) — число, на единицу меньшее, чем требуемый адрес размещения скомпилированной программы (подробнее смотрите в описании ZX-Compiler, стр. 106).

Работа с исходными текстами на Бейсике ничем не отличается от обычной. Необходимо только помнить, что область памяти над RAM TOP отводится под скомпилированную программу, а область с адреса 59300 по адрес 65350 для версии 1.1 или по 65400 для версии 1.7 занята самим компилятором, поэтому указанные области памяти нельзя использовать для других целей.

Обе версии запускаются оператором RANDOMIZE USR 59300

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

Далее о самом главном — об ограничениях, накладываемых Softek FP на текст исходной бейсик-программы:

противном случае по окончании работы скомпилированной программы произойдет сброс компьютера. Программа, остановленная оператором STOP, не может быть продолжена вводом CONTINUE;

• все сказанное об использовании логических операций при работе с Softek IS справедливо и для Softek FP33

* на применение операторов READ, DATA и RESTORE ограничений не накладывается

Softek FP так же, как его целочисленный «собрат» Softek IS, реализует некоторые дополнительные инструкции, не известные интерпретатору Бейсика. Операторы REM В {опрос нажатия CS/Space) и REM М (включение фрагмента в машинных кодах) работают так же, как и в Softek IS (см, стр. 11 3). Но, к величайшему сожалению, один из самых интересных дополнительных операторов Softek IS — печать символов в произвольную точку экрана (REM S) — наотрез отказывается работать в Softek FP.

Softek FP дополняет Spectrum-Бейсик еще двумя новыми операторами: REM Е и REM О.

REM Е, п

указывает компилятору на строку в тексте программы, где находится подпрограмма обработки ошибок*. Находясь в произвольном месте программы, этот оператор обеспечивает при возникновении любой ошибки переход к строке с номером п. Естественно, что применение оператора REM Е полностью исключает возможность останова программы при помощи оператора REM В. Более того, запущенная на выполнение программа, включающая в себя строку REM Е, п, не может быть остановлена обычными способами. Даже естественное окончание программы с выводом сообщения О ОК расценивается как ошибка и вызывает переход на строку, указанную в REM Е. Это создает известные неудобства: по завершению программы невозможен возврат к работе в интерпретаторе Бейсика. Но, с другой стороны, это в какой-то степени защищает программу от несанкционированного доступа.

Для того чтобы обезопасить себя от возможных неприятностей, связанных с использованием REM Ет лучше не включать этот оператор при пробных запусках программы, а вписывать его в уже окончательно отлаженный текст. Перед запусхом программы с оператором REM Е нужно не забыть сохранить ее исходный текст на внешнем носителе. В противном случае весь результат работы может быть потерян из-за невозможности вернуться в интерпретатор.

REM О, q, nl, п2, пп

реализует оператор группового перехода. Во многих версиях Бейсика в этом случае используется ключевое слово ON, в частности, в Beta Basic он записывается так:

GO ТО ON q; nl, n2f nn

В зависимости от значения параметра q осуществляется переход по одному из номеров строк, указанных в списке п1, п2, пп. При q=l осуществляется переход к строке с номером nl, при q=2 — к строке с номером п2 и т. д. Если значение q меньше или равно нулю, либо превышает число элементов списка, либо имеет дробное значение, то управление передается следующей за оператором REM О строке. Необходимо помнить, что q не может быть числом или выражением — только числовой переменной.

Tobos FP

Компилятор Tobos FP* (Tobos Floating Point) появился на свет в Польше в 1986 году и стал на сегодняшний день, пожалуй, наиболее популярным из всех известных бейсик-компиляторов для ZX Spectrum. Он удачно сочетает в себе относительно высокое быстродействие с максимальной совместимостью со Spectrum-Бейсиком. Tobos FP имеет ряд дополнительных возможностей, например, позволяет выбирать различные режимы компиляции в зависимости от нужд программиста и параметров исходного текста. Tobos может компилировать довольно большие программы, наиболее эффективно используя при этом память ZX Spectrum.

Компилятор состоит из бейсик-загрузчика (известно два варианта) и блока кодов длиной 12268 байт, располагающегося с адреса 53100. RAMTOP изначально устанавливается на адрес 39999, однако это значение может быть в любой момент изменено с помощью CLEAR <адрес>.

Компиляция запускается оператором

RANDOMIZE USR 53100

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

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

1 IF 1/2—0.5 THEN RANDOMIZE USR 53100: RANDOMIZE USR ADDR: STOP

- где ADDR — адрес начала скомпилированной программы. Тогда оператор RUN, введенный с клавиатуры, вызовет компиляцию и немедленный запуск скомпилированной программы. Секрет этого приема заключается в следующем: для интерпретатора Spectrum-Бейсика величины 1/2 и 0.5 — это не совсем одно и то же, а для компилятора эти два числа равны (о причинах — чуть позже). Поэтому при запуске программы средствами интерпретатора (RUN) значение выражения 1/2-0.5 не равно нулю, и выполняются операторы, следующие за THEN, то есть осуществляются компиляция программы и ее запуск. Вычисление выражения 1/2-0.5 в скомпилированной программе даст нулевой результат, и, следовательно, управление передастся следующей строке, минуя компиляцию.

В процессе компиляции, как и во время выполнения программы, могут появляться различные сообщения об ошибках. По смыслу они, в основном, соответствуют аналогичным сообщениям интерпретатора, однако некоторые из них имеют свои специфические особенности. Так, сообщение Variable not found выдается на этапе компиляции, если в тексте программы обнаруживается обращение к необъявленной переменной или массиву. Однако при работе в среде Tobos FP может сложиться парадоксальная ситуация, когда первое обращение к переменной может предшествовать ее объявлению операторами LET, FOR, INPUT или READ. Поясним. Например, совершенно нелепый, с точки зрения интерпретатора, текст:

10 PRINT А 20 PRINT В 30 PRINT С 40 LET А=А+1 50 LET В=А+С 60 LET С=А+В

для компилятора является абсолютно нормальным. Связано это с тем, что при компиляции в памяти компьютера резервируется место для всех числовых переменных, хотя бы раз упомянутых в операторах LET, FOR, INPUT или READ, и присваивается этим переменным нулевое значение. Следовательно, результатом работы вышеприведенного примера будет вывод на экран трех нулей, так как печать переменных осуществляется до того, как им впервые присвоено значение. Однако если бы этот пример имел следующий вид:

10 PRINT А 20 PRINT В 30 PRINT С

- то на этапе компиляции возникла бы ошибочная ситуация, которая привела бы к выдаче сообщения Variable not found, так как переменные А, В и С в программе не объявлены вообще. Благодаря этому эффекту можно не заботиться о принудительном обнулении переменных перед началом работы скомпилированной программы

— Tobos FP сделает это сам.

Сообщение RAMTOP no good может появиться при компиляции больших по объему исходных текстов в результате нехватки места для стека компьютера (между RAMTOP и областью бейсик-программы). В этом случае рекомендуется поднять RAMTOP приблизительно на 100 байт.

Сообщение Nonsense in BASIC может появиться при использовании не допустимых в среде Tobos FP операторов, таких как SAVE, LOAD, CONTINUE, а также CLEAR с параметром. Эти операторы относятся к числу тех немногих ограничений, которые Tobos FP все же накладывает на исходный текст программы.

Необходимо отметить, что Tobos FP не пользуется подпрограммами калькулятора ZX Spectrum, а имеет свой собственный, с другим форматом хранения чисел. Этот калькулятор производит вычисления с точностью до 7 значащих цифр, а не до 8, как это делает интерпретатор. Именно поэтому для Tobos FP величина 1/2 в точности равна 0,5. С наличием собственного калькулятора связано существенное увеличение объема Tobos FP по сравнению с компиляторами Softek.

Сообщение Out of memory возникает всякий раз, когда компилятору не хватает памяти для размещения скомпилированной программы. Эту ситуацию следует отличать от случая, когда аналогичное сообщение возникает до компиляции и означает, что компьютеру не хватает места для размещения текста исходной бейсик-программы. Для компиляции больших программ (объемом до 27 килобайт) существует ряд специальных приемов, которые будут подробно рассмотрены дальше.

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

Компилятор Tobos FP представляет собой достаточно гибкое программное средство, позволяющее выбирать различные режимы компиляции в зависимости от условий. Стандартный режим компиляции, задаваемый по умолчанию, более всего удобен для предварительной отладки небольших (до 13 килобайт) программ. Для готовых отлаженных программ удобно применять режим трансляции с сокращенным форматом вывода сообщений об ошибках (без указания номера ошибочной строки в исходном тексте). Это позволяет несколько сократить объем скомпилированной программы и ускорить ее работу. Режим включается оператором РОКЕ 53252,0, а выключается — РОКЕ 53252,55.

Для обработки больших программ может оказаться полезным режим компиляции с уничтожением исходного текста и размещением на его месте кодов скомпилированной программы. Включается режим оператором РОКЕ 53240,0, а выключается — РОКЕ 53240,55.

Кроме того, при компиляции очень больших программ может помочь справиться с неизбежными проблемами рациональное распределение памяти компьютера. Для того чтобы оптимально использовать память, необходимо знать несколько собственных системных переменных Tobos FP.

Ячейки 58112/13 содержат адрес размещения скомпилированной программы для режима компиляции без уничтожения исходного текста программы. Если обе ячейки содержат нули, то код размещается традиционно по адресу RAMTOP+1, если же нет, то по адресу РЕЕК 58112+256*РЕЕК 58113.

Несложная программа на Бейсике рассчитывает по заданному адресу значения параметров операторов РОКЕ и заносит их в системную переменную:

10 INPUT "ADDR", ADDR: REM Ввод адреса начала скомпилированной программы

20 RANDOMIZE ADDR: REM Преобразование двухбайтового числа

в два однобайтовых 30 РОКЕ 58112, РЕЕК 23670

40 РОКЕ 58113, РЕЕК 23671: REM Помещение полученных значений

в системные переменные Tobos FP 50 POKE 53240,55: REM Компиляция без уничтожения текста

Ячейки 55631/32 содержат адрес размещения' скомпилированной программы для режима трансляции с уничтожением исходного текста. Изначально эти ячейки содержат адрес 24000 для магнитофонной версии компилятора и 24100 для его дисковой версии.

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

10 INPUT "ADDR", ADDR 20 RANDOMIZE ADDR 30 POKE 55631, PEEK 23670 40 POKE 55632, PEEK 23671

50 POKE 53240, 0: REM Компиляция с уничтожением текста

Основные приемы компилирования больших программ сводятся, главным образом, к умелому манипулированию значениями RAMTOP и вышеперечисленных переменных. Можно порекомендовать такую последовательность работы:

1. установить RAMTOP равным 53099, освободив максимум пространства для исходного текста программы;

2. выбрать режим компиляции с уничтожением исходного текста программы оператором РОКЕ 53240,0 и режим сокращенных сообщений об ошибках оператором РОКЕ 53252,0;

3. запустить компиляцию оператором RANDOMIZE USR 53100 или при помощи запускающей строки и оператора RUN;

4. по окончании компиляции переместить RAMTOP на 1 байт ниже начала скомпилированной программы, выполнив CLEAR ADDR—1, и запустить последнюю на выполнение оператором RANDOMIZE USR ADDR.

Способы записи скомпилированной программы на внешний носитель подробно описаны в следующем разделе.


 


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


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

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




Похожие статьи:


В этот день...   3 сентября