|
Echo
#03
31 марта 1997 |
|
Книга - Тайники ZX-Spectrum: Ошибки в Системе.

Глава 9.
О Ш И Б К И В
С И С Т Е М Е
Авторы операционной системы и интерпре-
татора Бейсика в 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... 123, но с начала
первой строки на конец 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 Ошибка SCRFEEN#
В ячейке #2570 должно находится #C9
вместо #C3. В результате программа вместо
ожидаемого числа 12 выведет 22:
10 PRINT "1234567890"
20 LET A#=SCRFEEN#(0. 0) +SCREEN#(0.
1)
30 PRINT A#
Еще более удивительную печать получим,
если в конце строки 20 допишем +SCREEN#(0.
2) +SCREEN#(0. 4). Переменная примет зна-
чение "55". Эту ошибку легко обойти, до-
бавляя к A# значение SCREEN#(0. 1) по оче-
реди, а не одним выражением.
9. 11 Ошибка STR#
Работая с числами -1 < X < 1, но не
равными 0, можно "налететь" на необычную
"прожорливость" команды STR#. Попробуйте
выполнить следующие директивы:
PRINT "FLF"+"BUM CUK"+STR# . 001
PRINT 7+VAL STR# . 001
В обоих случаях на экране будет только
. 001, вина лежит на SPECTRUM.
9. 12 Ошибка CLOSE
Попытка отключения потока 4... 15 от
канала до его подключения ведет к непред-
виденным эффектам с рестартом системы
включительно. А все потому, что в ROM в
таблице, содержащей данные о каналах с ад-
ресом #1716 забыли разместить указатель
конца таблицы.
9. 13 Ошибка RET
Одна из труднейших в локализации оши-
бок. Проявляется иногда при возврате в
ZX-Бейсик из программы в машинном коде, в
вызываемой через USR K. Забыто перед возв-
ратом в интерпретатор восстановление пары
регистров H'L'. Если их использовала ваша
программа и модифицировала, то что прои-
зойдет при возврате в ZX-Бейсик дело слу-
чая. Обычно наступает зависание системы,
но не всегда.
9. 14 Ошибка NMI
Это одна из серьезных ошибок. Переклю-
чение одного бита по адресу #006D вызвало
то, что SPECTRUM не в состоянии принимать
обслуживающими программами немаскированных
прерываний от процедуры пользователя. Та-
кие прерывания либо могут игнорироваться,
либо рестартовать систему переходом по ад-
ресу 0. Это делает невозможным контроли-
руемый рестарт системы после ее сбоя, так
же и реализацию других возможностей ком-
пьютера. Устранение этой ошибки требует
нелегких и дорогостоящих доработок.
9. 15 Ошибка PAUSE
Проблема с инструкцией PAUSE заключает-
ся в том, что она не всегда выполняется.
Ошибка в процедуре, обслуживающей дублиро-
ванные клавиши, приводит к тому, что при
нажатии какой-либо клавиши, непосредствен-
но перед выполнением инструкции PAUSE, она
игнорируется. Пример:
10 PRINT "отпусти клавишу, когда услы-
шишь звук"
20 FOR I=1 то 500; NEXT I
30 BEEP 1, 10
40 PAUSE 0
50 PRINT "конец"
Поведение программы даже не намекает на
существование в ней строки 40.
9. 16 Ошибка CLS
При значениях системной переменной
DF_SZ < Z трудно воспринять результат этой
команды за очистку экрана. Для DF_SZ =1
это можно считать несущественным, но при
DF_SZ = 0 это уже трагедия.
Надеемся, что приведенный перечень ис-
черпывает "неожиданности", при программи-
ровании на ZX-SPECTRUM.
;----------------------------------------;
┌ ┐
Заява
Прашу лiчыць мяне камунiстам калi я не
дажыву да наступнага нумару. А калi дажы-
ву, тады не личыць.
Галоуны рэдактар.
└ ┘
А вообще, в следующем номере будет
опубликована следующая книга из этой же
серии: 'ZX-SPECTRUM изнутри'.
Адчуваю, што не дажыву...
Другие статьи номера:
Похожие статьи:
В этот день... 15 ноября