Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ZX-Review-1992-01-12.pdf
Скачиваний:
246
Добавлен:
28.03.2015
Размер:
2.43 Mб
Скачать

18 Ошибка проверки синтаксиса.

Эта ошибка проявляется только на машинах 48К, а на машинах 128К она мудро игнорируется.

Дело в том, что у Вас есть возможность ввести в программную строку такие ключевые слова, как ERASE, MOVE, FORMAT, CAT, например

ERASE симв. строка

MOVE строка, строка FORMAT строка

CAT

Очевидно, что эти команды не могут быть выполнены, если у Вас не подключена соответствующая периферия, например INTERFACE ONE с микродрайвом.

И, конечно, при запуске программы на исполнение, она будет прервана с сообщением об ошибке. Спрашивается, почему же нельзя было отловить эту ошибку при проверке синтаксиса перед вводом строки в память?

На 128 килобайтных машинах тоже можно ввести такие ключевые слова, но при запуске программы они будут игнорироваться и восприниматься так, как воспринимается оператор RЕМ.

Ошибки калькулятора

Теперь рассмотрим несколько ошибок, связанных со встроенным в ПЗУ калькулятором. О некоторых из них мы так или иначе уже упоминали в своих прочих работах.

19. Ошибка MOD_DIV.

Эта ошибка связана с работой кода калькулятора 32h. По этой команде со стека калькулятора должны сниматься два верхних пятибайтных числа, например x и y и вместо них на стек должны отправляться

x MOD y и x DIV y

(именно в этом порядке).

Напомним, что x MOD y это остаток от целочисленного деления x на y, а x DIV y это целая часть частного от деления x на y.

Таким образом,

x MOD y = x y*INT(x/y) x DIV y = INT (x/y)

Всвоих расчетах процедура, обслуживающая эту функцию калькулятора, использует нулевую ячейку памяти калькулятора M0, а с этой ячейкой есть одна особенность. Дело в том, что при вычислении функции INT эта ячейка коррумпируется, если аргумент при INT меньше нуля. Таким образом, функция MOD_DIV калькулятора дает неверный результат, когда x/y число отрицательное.

Ошибки могло бы и не быть, если бы процедура, занимающаяся расчетом этой функции (а она расположена в ПЗУ по адресу 36A0H = 13964 DEC) использовала бы в своих расчетах не нулевую ячейку памяти калькулятора, а первую (M1).

20.Ошибка E_TO_FP.

Всистеме команд калькулятора есть команда с кодом 3C. Ее назначение умножение числа, находящегося на вершине стека калькулятора на множитель, равный 10 в степени A, где A содержимое аккумулятора микропроцессора.

Вся неприятность в том, что калькулятор после своего включения командой RST 28 не резервирует содержимое аккумулятора, в отличие от содержимого регистра B. Поэтому, к тому времени, как вы воспользуетесь командой калькулятора 3C, есть большая вероятность того, что в аккумуляторе будет не подготовленное вами число, а что то совсем другое.

Единственный выход выйти из калькулятора, прогрузить аккумулятор нужным Вам числом, выполнить нужное умножение вызовом процедуры ПЗУ E_TO_FP и снова вернуться в калькулятор:

Endcalc

LD A, xx CALL 2D4FH RST 28

Процедура E_TO_FP находится в ПЗУ по адресу 2D4FH = 11599 DEC.

21. Ошибка INKEY$#0.

Обычно нулевой поток представляет собой клавиатуру, поэтому естественно предположить, что INKEY$#0 то же самое, что и просто INKEY$ без номера потока.

Тем не менее это не так, и почти необратимо INKEY$#0 выдает пустую символьную строку, что делает эту функцию полностью бесполезной.

Надо также заметить, что в системе команд калькулятора есть команда с кодом 1А, которая служит для расчета функции INKEY$#X, где X число, содержащееся на вершине стека калькулятора. И эта команда калькулятора будет бесполезной, если поток X представляет клавиатуру.

Ошибка находится в подпрограмме ПЗУ по адресу 1634Н=5684 DEC, которая устанавливает канал "X" текущим каналом. В этой подпрограмме по адресу 1638К стоит ошибочная команда RES 5,(FLAGS), выключающая пятый бит системной переменной FLAGS. в результате этого ошибочно отбивается любое нажатие клавиши вместо того, чтобы быть принятый к рассмотрению.

Ошибку можно было бы исправить, если в подпрограмме READ_IN (3645Н = 13893 DEC) сохранить значение системной переменной FLAGS на время вызова подпрограммы CHAN_OPEN (1601Н = 5633 DEC).

На этом мы заканчиваем обзор ошибок и неточностей в ПЗУ стандартного компьютера "ZX Spectrum". Конечно же это не все из того, что оттуда можно выудить, но очень экзотические ошибки, которые проявляются например только на машинах типа "ZX Spectrum+2" и только при подключенном Интерфейсе 1 мы не рассматриваем, поскольку вероятность встретить среди миллионов наших пользователей подобную конфигурацию конечно есть, но она не более сотой доли процента.

Обзор подготовлен по материалам зарубежной печати; основные первоисточники:

1.Dr. Yan Logan, Dr. Frank O'Hara. "The Complete Spectrum ROM Disassembly".

2.Dr. FranK O'Hara "Understanding Your Spectrum".

3.Dr. Yan Logan "Understanding Your Spectrum".

4.Andrew Pennell "Master Your ZX Microdrive".

5.Tony Stratton "Understanding Your Spectrum".

6.Paul Harrison "Understanding Your Spectrum".

7.Stephen Kelly & others "Understanding Your Spectrum".

8.Chris Thornton "Understanding Your Spectrum".

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]