9. Ошибки в системе
Авторы операционной системы и интерпретатора BASIC в
ZX-Spectrum выполнили превосходную работу, но не смогли уберечься
от нескольких ошибок.
9.1 Ошибка деления
Под адресом #3200 помещено значение #E1 вместо #DA. В
результате иногда теряется последний бит, что приводит к ошибочным
округлениям. Последствия ошибки демонстрирует программа:
10 LET A=A/B
20 IF A THEN GO TO 10
30 PRINT "Получен нуль"
Запуская ее со значениями A=1 и B=3, через секунду получаем
печать "Получен нуль". Запуская ее заново со значениями A=1 и B=2
зацикливаемся, т.к. Spectrum считает, что 2^-128=2^-128/2.
9.2 Ошибка "-65536"
Авторы допустили неточность в представлении этого числа. Один
раз оно хранится в представлении с плавающей запятой, другой - как
целое число в коде дополнения до 2. Последствия неоднозначности
проявляются, к примеру, при выполнении директивы: PRINT -65536. На
экране появится число -1.
9.3 Ошибка CHR$ 8.
Этот управляющий символ должен перемещать курсор на одну
позицию влево или на конец предыдущей строки. Именно так и
происходит в строках 1...23, но с начала 1-ой строки на конец 0-й
перейти невозможно. К любопытным эффектам ведет себя просьба
сдвинуть курсор влево от поля (0,0).
9.4 Ошибка CHR$ 9
Этот символ должен сдвигать курсор вправо на одну позицию.
Здесь, однако, допущена серьезная ошибка: все необходимые расчеты
выполняются, однако авторы забыли модифицировать системные
переменные.
9.5 Ошибка "Press any key..."
В некоторых ситуациях Spectrum прерывает работу и ждет толчка
нажатием любой клавиши пользователем. Ошибка ведет к тому, что
компьютер не реагирует на клавишу CS и на SS, хотя на обе сразу
реагирует.
9.6 Ошибка указателя бегущей строки
Допустим, что последняя строка в программе имеет номер 1000.
При нажатии 1001 и "ENTER", а затем CS/1, в нижнюю часть экрана
будет скопирована строка 1000, но вместе с указателем бегущей
строки, который перед записью необходимо удалять.
9.7 Ошибка DELETE
При удалении содержимого нижней части экрана с помощью CS/1 в
нижнюю часть экрана скопируется текущая строка программы и
невозможен возврат к контрольному размеру этой области. Требуется
вновь нажать "ENTER".
9.8 Ошибка ведущих пробелов
Некоторые ключевые слова во время высвечивания не всегда
отделяются пробелами от предшествующих. Попробуйте, например,
выполнить
PRINT CHR$ 255:CHR$ 13:CHR$ 255
9.9 Ошибка режима K
После нажатия клавиши в режиме K и при удержании ее в этом
положении, клавиша начинает размножаться. Курсор меняется на L или
C, но все время печатается символ в режиме K.
9.10 Ошибка SCREEN$
В ячейке #2750 должно находиться #C9 вместо #C3. В результате
программа вместо ожидаемого числа 12 выведет 22:
10 PRINT "1234567890"
20 LET A$=SCREEN$(0,0)+SCREEN$(0,1)
30 PRINT A$
Еще более удивительную печать получим, если в конце строки 20
допишем +SCREEN$(0,2)+SCREEN$(0,4). Переменная примет значение
"55". Эту ошибку легко обойти, добавляя к A$ значение SCREEN$(0,I)
по очереди, а не одним выражением.
9.11 Ошибка STR$
Работая с числами -1