Глава 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 изнутри'. Адчуваю, што не дажыву...