Новый «чудесный» ROM для ZX Spectrum добавляет побуквенный ввод

Многие владельцы ZX Spectrum не раз сталкивались с одной из главных особенностей Sinclair BASIC — системой токенов, которая не позволяет просто напечатать определённый оператор или функцию по буквам. Для ввода некоторых операторов достаточно нажать буквально одну букву в начале строки — и это, конечно, в теории звучит очень здорово.

Однако другие команды и функции вызываются предварительным переходом в расширенный режим, зажатием дополнительной клавиши и лишь после этого — нажатием нужной кнопки. И всё это иногда сопровождается мучительными попытками вспомнить или отыскать на клавиатуре нужную функцию, хотя в любом другом Бейсике её давно можно было просто ввести побуквенно.

Эта система досталась «Спектруму» от его предков — компьютеров ZX80 и ZX81. Памяти у них было кот наплакал — всего 1 Кб. Поэтому операторы Бейсика просто необходимо было хранить токенами — это сильно сокращало размер программ. ПЗУ с интерпретатором Бейсика тоже не отличалось размерами (4 Кб в ZX80 и 8 Кб в ZX81), поэтому сложные процедуры проверки синтаксиса при вводе и конвертации слов в токены решили не делать.

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

Клайву Синклеру или Стиву Викерсу (автору Sinclair BASIC), конечно, стоило бы добавить дополнительный режим побуквенного ввода. Но по разным причинам — не сложилось. Проблему (впрочем, для кого-то она таковой не является) исправили в ZX Spectrum 128 — в тамошнем улучшенном Бейсике пользователю не приходится иметь дело с токенами напрямую.

Но на компьютерах с 48 Кб ОЗУ вводить программы на Бейсике — особенно если вы новичок или вернулись к программированию после большого перерыва, — это настоящее мучение. Бороться с этим на обычных компьютерах практически бесполезно — нужно просто запомнить расположение всех команд. Но если вы пользуетесь эмуляторами, то есть варианты.

Например, режим побуквенного ввода команд в Sinclair BASIC можно включить в новом эмуляторе Spectral. Однако задолго до него — аж в 2004 году — Джефф Вермут реализовал решение для других эмуляторов и даже некоторых реальных компьютеров: The Gosh Wonderful ZX Spectrum ROM. А недавно у него вышла новая версия — 1.40.

Устроена эта штука достаточно просто: достаточно заменить ПЗУ классического ZX Spectrum или любой другой машины с одним 16-килобайтным банком постоянной памяти на новый ROM, и ваш «Спектрум» обретёт несколько полезных новых возможностей.

Например, побуквенный ввод — именно это считается главной фишкой ПЗУ. Вы печатаете команды как на любом другом компьютере, а операторы и функции превращаются в токены после ввода строки. Если напечатать ключевое слово неверно, то ввести строку не получится — интерпретатор укажет на ошибку.

По умолчанию режим побуквенного ввода включён, но его можно выключить, введя команду STOP. Включить обратно можно точно так же — с помощью STOP (SS+A).

The Gosh Wonderful ZX Spectrum ROM понимает и несколько новых команд — их надо писать после стандартного оператора REM:

  • REM COMMANDS или просто REM — показывает список доступных команд;
  • REM RENUMBER начало шаг — перенумеровывает всю программу: первой строке будет присвоен номер «начало», а дальше номера будут увеличиваться с «шагом»;
  • REM DELETE первая последняя — стирает строки, начиная с «первой» и до «последней» включительно;
  • REM STREAMS — показывает список всех потоков.

А отличия версии 1.40 от предыдущих состоят в исправленной математике: автор решил исправить несколько наиболее вопиющих ошибок встроенного спектрумовского Бейсика.

Например, попробуйте ввести на классическом «Спектруме» следующую команду:

PRINT 0.123-123/1000

Поразительно, но вместо нуля вас ждёт просто очень маленькое число: -2.910383E-11.

Это происходит из-за того, как оригинальный ROM обрабатывает десятичные дроби. Число 0.123 он разбирает, умножая цифры на 1/10, 1/100, 1/1000 — а эти дроби нельзя точно представить в двоичной системе. Результат накапливает микроскопические ошибки, и в итоге 0.123 хранится в памяти чуть-чуть неправильно. А вот 123/1000 вычисляется иначе, через целочисленное деление: и даёт другой результат. Именно разница между двумя «почти нулями» и порождает эту аномалию.

В новом ROM десятичные дроби обрабатываются принципиально иначе: дробная часть тоже трактуется как целое число. Когда вы вводите 0.123, интерпретатор видит «123 после точки» и вызывает ту же надёжную процедуру INT-TO-FP, что и для целых чисел. Затем отдельная подпрограмма DIVISOR вычисляет делитель (в данном случае 1000), и калькулятор выполняет честное деление 123/1000. Теперь PRINT 0.123 и PRINT 123/1000 гарантированно дают одинаковый результат — а значит, их разность равна нулю.

Слева — обычный ROM. Справа — The Gosh Wonderful.

Ещё одно исправление касается округления при делении. Некоторые числа вроде 0.987654325 (то есть 987654325/1000000000) должны были округляться вверх, но оригинальный ROM этого не делал. Проблема решена сбором так называемого 34-го бита при операции деления — эту технику описывали Логан и О'Хара в своих книгах по внутреннему устройству «Спектрума». Правда, на некоторых клонах вроде Timex TC2048 это исправление вызывает собственные проблемы, так что применять его можно только в «чистой» математической среде.

Наконец, переработана процедура вычисления квадратных корней. Вместо оригинального алгоритма используется метод Ньютона-Рафсона — итеративный способ, который Стив Викерс и его сестра описывали ещё в руководствах к Jupiter Ace. В ZX81 для него просто не хватило места в ПЗУ.

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

Словом, The Gosh Wonderful ZX Spectrum ROM принёс огромное количество улучшений, а недостатков у него практически нет. Автор заявляет 100%-ную совместимость со всем софтом для ZX Spectrum, хотя все мы прекрасно знаем, что такого не может быть, если изменён хотя бы один байт в ROM. Но охотно верим, что условные 99,9% игр заработают вообще без проблем.

💾 Скачать The Gosh Wonderful ZX Spectrum ROM можно с сайта проекта или с «Идеального пикселя». А ещё можно почитать руководство пользователя, в котором все изменения описываются ещё подробнее.

Первоисточник: k1.spdns.de
Теги: ZX Spectrum

Оставлять комментарии могут только авторизованные пользователи.