СЖАТИЕ БЕЙСИК-ПРОГРАММ
Существенный недостаток ZX Spectrum —
относительно малый объем свободной памяти (около 40 килобайт). А тут
еще интерпретатор Бейсика «транжирит» память: под запись
любого числа интерпретатор отводит 6 ячеек памяти независимо от размера
числа. Даже если это просто единица или ноль. Вот и приходится
программистам, работающим на Бейсике, изощряться, чтобы втиснуться в
узкие рамки памяти Speccy.
Прежде всего надо расширить область памяти,
отведенную для работы бейсик-программы. Границы, в которых может
размещаться программа с переменными, определяются компьютером, но могут
быть изменены. Старший адрес памяти, разрешенный к использованию
интерпретатором Бейсика, хранится в системной переменной RAMTOP (23730/31). Стандартно он равен 65367. Но если программа не вмещается, его можно увеличить до предела — до 6553522.
Для этого нет необходимости записывать новое значение RAMTOP с помощью
РОКЕ. Изменить RAMTOP можно с помощью специально предназначенного для
этого оператора CLEAR с параметром 65535. Правда, CLEAR к тому же
очистит все переменные, массивы, выполнит операторы CLS и RESTORE,
вообще подготовит программу к новому пуску.
Если и после перемещения RAMTOP не хватает памяти, придется применять более изощренные методы.
Приведем несколько самых распространенных способов сжатия бейсик-программ. Хотя в этой области нет предела для фантазии.
Во-первых, надо свести к минимуму длину имен
всех числовых переменных. Если их меньше, чем букв в алфавите, то все
сделать однобуквенными.
Памятуя, что числовые константы занимают много
места, не помешает самые часто используемые из них заменить на
переменные. Надо только единожды в начале программы присвоить им
требуемые значения.
Целые числовые константы выгоднее записывать
как символьные и помещать их «под» функцию VAL. К примеру,
операторы LET а=5 и LET a=VAL "5й тождественны, однако второй оператор занимает в памяти на две ячейки меньше (но, следует учесть, работает медленнее).
Для сокращения объема памяти, занимаемого
программой, бывает полезно вместо числовых массивов использовать
символьные. Ведь под каждый элемент числового массива, независимо от
того, что в нем хранится, отводится по пять ячеек памяти, в то время,
как под элемент символьного массива отводится лишь одна ячейка.
Преобразовать же символьную константу в число можно с помощью той же
VAL.
И, напоследок, парочку «хитростей».
Например, вместо нуля, который, как и любое число, занимает в памяти 5
байт, можно записать просто BIN, либо NOT PI. Число «пи»
отлично от нуля, и это главное, а логический оператор NOT, по
определению, превращает его в ноль. Внешне получилось длиннее и
мудреней, но в памяти, тем не менее, такая запись займет лишь две
ячейки. Вывернувшись, можно «смоделировать» и единицу.
Например, записав NOT BIN либо SNG PI.