
- •Спектрум в школе
- •1. "LISTNAME"
- •2. "REMONT"
- •BETA BASIC
- •ГЛАВА 1. ВВЕДЕНИЕ
- •ГЛАВА 2. РЕДАКТИРОВАНИЕ
- •Курсор текущей строки
- •Команда EDIT <номер строки>
- •Переключение режимов курсора
- •Управление вводом ключевых слов
- •Проверка синтаксиса
- •Команда LIST FORMAT
- •Команда CSIZE
- •Команды JOIN <номера строк> и SPLIT.
- •Управляющий код "новая строка".
- •ГЛАВА 3. ПРОЦЕДУРЫ
- •Передача параметров в виде ссылки
- •Передача параметров списком
- •Рекурсия
- •Ошибки
- •ГЛАВА 4. СТРУКТУРНОЕ ПРОГРАММИРОВАНИЕ
- •ГЛАВА 5. ОБРАБОТКА ДАННЫХ
- •ГЛАВА 6. ГРАФИКА
- •ГЛАВА 7. СЕРВИСНЫЕ И ОТЛАДОЧНЫЕ ВОЗМОЖНОСТИ
- •ЗАЩИТА ПРОГРАММ
- •ЧАСТЬ 1
- •ГЛАВА 1. Исключение возможности остановки программ.
- •1.1. Общие рекомендации.
- •1.2 Подпрограмма обработки сообщений с кодами D, H, L.
- •1.6. Метод защиты, используемый в программе FIST III.
- •2.1. Общие рекомендации.
- •2.3. Использование управляющих кодов.
- •40 ЛУЧШИХ ПРОЦЕДУР
- •РАЗДЕЛ А
- •1. ВВЕДЕНИЕ
- •Общие сведения о Бейсике и машинных кодах
- •2. ВНУТРЕННЯЯ СТРУКТУРА ZX SPECTRUM
- •Карта памяти
- •PEEK и POKE
- •Дисплейный файл
- •Атрибуты
- •Буфер принтера
- •Область программ на BASICe
- •Цифровой пятибайтный формат
- •Область переменных
- •Подпрограммы ПЗУ
- •3. МАШИННЫЙ ЯЗЫК Z80
- •Регистры Z80A
- •РАЗДЕЛ B
- •4. ВВЕДЕНИЕ
- •Загрузчик машинного кода
- •5. Подпрограммы сдвига.
- •5.1 Сдвиг атрибутов влево.
- •5.2 Сдвиг атрибутов вправо.
- •5.3 Сдвиг атрибутов вверх.
- •5.4 Сдвиг атрибутов вниз.
- •5.5 Сдвиг влево на один символ.
- •5.6 Сдвиг вправо на один символ.
- •5.7 Сдвиг вверх на один символ
- •МАСТЕРФАЙЛ 09 полная русификация.
- •ВСТУПЛЕНИЕ.
- •2. Использование дополнительного символьного набора.
- •3. Перевод программы на русский язык.
- •СОВЕТЫ ЭКСПЕРТОВ
- •STALINGRAD
- •Введение.
- •Управление игрой
- •Некоторые детали
- •Уровни сложности игры
- •Выгрузка файлов на ленту
- •Замечания
- •FLIGHT SIMULATION
- •Аспекты полета
- •Приборная панель
- •Управление самолетом
- •Навигация
- •STAR RAIDERS
- •Враги
- •Запуск игры
- •Экран
- •Управление
- •Энергия
- •THE TRAIN
- •Краткий сюжет
- •Настройка программы
- •Экран
- •Управление
- •Мост (BRIDGE)
- •Станция (STATION)
- •Развилка или перекресток (SWITCH)
- •DEATH WISH 3
- •FORUM
- •Проблемы ELITE
- •Итоги конкурса на лучший технологически развитый маршрут.
- •POKES
- •Вопросы совместимости.
- •Просьба о помощи.
- •И снова SHERLOCK.
- •СПЕКТРУМ В ШКОЛЕ
- •К УРОКУ ИСТОРИИ.
- •POKES
- •NETHER EARTH
- •HEAD OVER HEELS
- •INTO THE EAGLE'S NEST
- •URIDIUM
- •AMAUROTE
- •GAUNTLET
- •BETA BASIC
- •РАЗДЕЛ 2. КОМАНДЫ
- •1. ALTER <атрибуты> ТО атрибуты
- •2. ALTER <ссылка> ТО ссылка
- •3. AUTO <номер строки> <,шаг>
- •4. BREAK
- •5. CLEAR число.
- •6. CLOCK число или строка
- •7. CLS <номер окна>
- •8. CONTROL CODES (управляющие коды)
- •Коды управления экранными блоками.
- •9. COPY строка COPY массив
- •10. CSIZE ширина <, высота>
- •11. DEFAULT = устройство
- •12. DEF KEY односимвольная строка; строка
- •13. DEF PROC имя процедуры <параметр><,REF параметр>...
- •14. DELETE <номер строки> ТО <номер строки>.
- •15. DELETE имя массива <пределы>
- •ЗАЩИТА ПРОГРАММ
- •ПРОГРАММА ДЛЯ СНЯТИЯ ЗАЩИТ
- •Глава 3. Методы защиты от MERGE
- •40 ЛУЧШИХ ПРОЦЕДУР
- •5.8 Сдвиг вниз на один символ.
- •5.9 Сдвиг влево на один пиксел.
- •5.10 Сдвиг вправо на один пиксел.
- •5.11 Сдвиг вверх на один пиксел.
- •5.12 Сдвиг вниз на один пиксел.
- •6.ДИСПЛЕЙНЫЕ ПРОГРАММЫ
- •6.1 Слияние картинок
- •6.2. Инвертирование экрана.
- •6.3 Инвертирование символа вертикально.
- •6.4 Инвертирование символа горизонтально.
- •6.5 Вращение символа по часовой стрелке.
- •6.6 Изменение атрибута.
- •6.7 Смена атрибута.
- •6.8 Закрашивание контура.
- •6.9 Построение шаблонов.
- •6.10 Увеличение экрана и копирование.
- •Текстовые сообщения программы MF 09 и их перевод
- •ЗАКЛЮЧЕНИЕ.
- •СОВЕТЫ ЭКСПЕРТОВ
- •PROFESSIONAL TENNIS
- •1. Controles
- •2. Equipamiento
- •3. Entrenamiento
- •4. Caracteristicas
- •0. Torneo
- •SNOOKER
- •Правила игры.
- •Настройка программы.
- •Структура экрана.
- •Начало игры.
- •QUAZATRON
- •CAPTAIN FIZZ
- •Экран программы.
- •Полезные советы.
- •FORUM
- •Версия 1.
- •Версия 2.
- •Версия 3
- •Перелеты к двойным звездам и невидимым звездам.
- •Тайные возможности компьютера.
- •Советы и секреты.
- •СПЕКТРУМ В ШКОЛЕ
- •BETA BASIC
- •17. DPOKE адрес, число
- •18. DRAW ТО x,y <,угол>
- •18. EDIT <номер строки>
- •9. EDIT строковая переменная
- •20. ELSE <оператор>
- •21. END PROC
- •22. EXIT IF <условие>
- •23. FILL x,y
- •24. GET числовая переменная
- •25. GET строковая переменная, x,y <ширина, длинах><;тип>
- •26. JOIN <номер строки>
- •27. JOIN строковый массив или числовой массив.
- •28. KEYIN строковая переменная
- •29. KEYWORDS число.
- •30. LET переменная = число <, переменная = число>...
- •31. LIST <номер строки> TO <номер строки>
- •32. LIST DATA
- •33. LIST DEF KEY
- •ЗАЩИТА ПРОГРАММ
- •Глава 4. Прочие приемы защиты.
- •4.1 Запуск программ в кодах.
- •4.3 Ключевые слова Бейсика в "хэдере".
- •4.4 Мерцающий заголовок.
- •Глава 1. Введение
- •Общие рекомендации.
- •Структура фирменной программы.
- •Небольшая историческая справка.
- •Структура хэдера.
- •Глава 2. Блокировка автозапуска.
- •Введение.
- •2.1 Загрузка Бейсика через блок кодов.
- •40 ЛУЧШИХ ПРОЦЕДУР
- •7. ПРОЦЕДУРЫ ОБРАБОТКИ ПРОГРАММ.
- •7.1 Удаление блока программы.
- •7.2 Обмен токена.
- •7.3 Удаление REM строк
- •7.4 Создание REM строк
- •7.5 Сжатие программы.
- •8. ИНСТРУМЕНТАЛЬНЫЕ ПРОГРАММЫ
- •8.1 Определение размера свободной памяти.
- •8.5 Копирование данных в памяти.
- •ВОЗВРАЩАЯСЬ К НАПЕЧАТАННОМУ
- •КАНАЛЫ И ПОТОКИ
- •ПРОФЕССИОНАЛЬНЫЙ ПОДХОД
- •ОБРАБОТКА ОШИБОК В БЕЙСИКЕ
- •ПРЕДОТВРАЩЕНИЕ ОСТАНОВКИ БЕЙСИК ПРОГРАММЫ
- •1. Блок кодов "ON ERROR GO TO"
- •2. Программа "BEEPER"
- •FORUM
- •Адвентюрные игры.
- •Heavy on the Magic.
- •Полезные советы.
- •Советы и секреты.
- •Письмо читателя.
- •Проблемы совместимости.
- •Проблемы "ELITE".
- •СОВЕТЫ ЭКСПЕРТОВ
- •ACADEMY (TAU CETI II)
- •Работа с меню.
- •Просмотр/выбор клавиш.
- •Прием нового кадета.
- •Меню работы с лентой.
- •Рапорт о выполнении уровня.
- •Выбор скиммера.
- •Проектирование скиммеров.
- •Выбор миссии.
- •Уровень I.
- •Уровень II.
- •Уровень III.
- •Уровень IV.
- •Уровень V.
- •Полезные советы по сборке скиммеров.
- •Выполнение миссии.
- •Сводка боевых команд
- •SHERLOCK
- •Понедельник, 8:00
- •Вторник.
- •Среда.
- •НАШ КОНКУРС
- •Письмо читателя.
- •Наши предложения.
- •Наши условия:
- •BETA BASIC
- •34. LIST FORMAT число.
- •35. LIST PROC имя процедуры.
- •36. LIST REF.
- •37. LOCAL переменная <,переменная><,переменная>...
- •38. LOOP
- •39. MERGE
- •40. MOVE
- •42. ON ERROR номер строки
- •43. OVER 2.
- •44. PLOT X,Y <;строка>
- •45. POKE адрес, строка
- •46. POP <числовая переменная>
- •47. PROC имя <параметр><,параметр><,параметр>...
- •49. REF метка
- •50. REF имя переменной.
- •52. ROLL код направления <, число><; х, y; ширина, длина >
- •ЗАЩИТА ПРОГРАММ
- •2.2.2 Изменение хэдера для блокировки автозапуска.
- •3.1 Просмотр строк, защищенных управляющими кодами.
- •40 ЛУЧШИХ ПРОЦЕДУР
- •8.5 Составление списка переменных.
- •8.6 Поиск строки.
- •8.7 Поиск и замещение строки.
- •8.8 Поиск подстроки.
- •Формат данных в "Спектруме"
- •Числовая переменная с именем из одной буквы.
- •Числовая переменная с именем более чем из одной буквы.
- •Числовой массив.
- •Переменные цикла.
- •Символьная переменная.
- •Символьный массив.
- •ЭЛЕМЕНТАРНАЯ ГРАФИКА В МАШИННЫХ КОДАХ
- •ЭЛЕМЕНТАРНАЯ ГРАФИКА В МАШИННЫХ КОДАХ
- •Печать чисел.
- •Печать символьных строк.
- •Управляющие символы.
- •Другие приемы управления позицией и цветом печати.
- •Организация экранной памяти.
- •Файл атрибутов.
- •Изменение цвета бордюра.
- •Эмуляция команд БЕЙСИКа из машинного кода.
- •Скроллинг экрана.
- •PAUSE
- •Рисование точек.
- •Рисование прямых линий.
- •Рисование дуги.
- •Рисование окружности.
- •Проверка точки экрана.
- •Проверка атрибутов экрана.
- •Проверка содержимого заданного знакоместа.
- •СЛУЧАЙНАЯ ГРАФИКА
- •СЛУЧАЙНАЯ ГРАФИКА
- •Проблемы скорости работы.
- •Трансляция БЕЙСИКа в машинный код.
- •КРИБЕДЖ
- •КРИБЕДЖ
- •Игра.
- •Стратегия в крибедже.
- •Пример розыгрыша партии.
- •Программа
- •Комментарий
- •THE DARK WHEEL
- •ГЛАВА 1.
- •СПЕКТРУМ В ШКОЛЕ
- •BETA BASIC
- •53. SAVE <строка TO строка;> устройство;> имя
- •54. SCROLL код направления <,число> <;x,y; ширина, длина>
- •55. SORT
- •56. SPLIT (не ключевое слово).
- •57. TRACE номер строки
- •58. UNTIL условие.
- •59. USING, USING$
- •60. VERIFY <строка TO строка;> устройство;> имя
- •61. WHILE условие.
- •62. WINDOW номер окна <,x,y,w,l>
- •РАЗДЕЛ 3. ФУНКЦИИ
- •1. AND (число, число)
- •3. CHAR$ (число)
- •4. COSE (ЧИСЛО)
- •5. DEC (символьная строка)
- •ЗАЩИТА ПРОГРАММ
- •3.2 Работа со встроенными машинными кодами.
- •Глава 4. Изучение блоков в машинных кодах.
- •4.1 Введение.
- •4.2 Адаптация фирменных программ под индивидуальный вкус.
- •4.2.2. Новые возможности программы "RENEGADE".
- •Введение.
- •ГЛАВА 1.
- •ПРОФЕССИОНАЛЬНЫЙ ПОДХОД
- •"ДЕБЮТ ПРОГРАММЫ"
- •Блок кодов "REM FILL"
- •УНИВЕРСАЛЬНОЕ МЕНЮ
- •Программа "PRIM"
- •Маленькие Хитрости
- •ВЕКТОРНАЯ ГРАФИКА
- •Сокрытие невидимых линий контура
- •Алгоритм.
- •Маленькие хитрости
- •ОШИБКИ ПЗУ
- •1. Ограничение по использованию регистровой пары IY.
- •2. Особенности регистровой пары H'L' (альтернативной).
- •3. Особенности пользовательской функции FN.
- •4. Ошибка деления.
- •6. Ошибка оператора PLOT.
- •7. Ошибка первого экрана в компьютерах 128К.
- •Blinky's
- •СОВЕТЫ ЭКСПЕРТОВ
- •OPERATION HORMUZ
- •TOMAHAWK
- •SKY RANGER
- •TYPHOON
- •THE DARK WHEEL
- •ГЛАВА 2.
- •BETA BASIC
- •6. DPEEK (адрес).
- •7. EOF (номер потока).
- •8. FILLED ().
- •9. HEX$ (число).
- •11. INSTRING (старт, строка 1, строка 2).
- •12. ITEM ()
- •13. LENGTH (n, "имя массива")
- •15. MEMORY$ ()
- •16. MOD (число, число)
- •17. NUMBER (симв. строка)
- •18. OR (число, число)
- •19. RNDM (число)
- •20. SCRN$ (строка, столбец)
- •21. SHIFT$ (число, строка)
- •22. SINE (число)
- •23. STRING$ (число, строка)
- •24. TIME$ ()
- •25. USING$ (строка, число)
- •26. XOR (число, число)
- •ПРИЛОЖЕНИЕ 1
- •ПРИЛОЖЕНИЕ 2.
- •ПРИЛОЖЕНИЕ 3
- •Коды ошибок.
- •ЗАЩИТА ПРОГРАММ
- •1.2 Смещение системной переменной PROG.
- •1.3 Кодирование и декодирование блоков машинных кодов.
- •1.4 Новые POKES.
- •Том 4. Методы защиты программ от копирования.
- •Введение.
- •ОШИБКИ ПЗУ
- •8. Ошибка CLOSE#.
- •9. Ошибка CHR$ 9.
- •10. Ошибка CHR$ 8.
- •11. Ошибка STR$.
- •12. Ошибки кодов управления цветом.
- •13. Ошибка SCREEN$.
- •Ошибки в редакторе
- •14. Ошибка Scroll?.
- •15. Ошибка курсора текущей строки.
- •16 Ошибка ведущего пробела.
- •18 Ошибка проверки синтаксиса.
- •Ошибки калькулятора
- •19. Ошибка MOD_DIV.
- •20. Ошибка E_TO_FP.
- •21. Ошибка INKEY$#0.
- •ПРОФЕССИОНАЛЬНЫЙ ПОДХОД
- •Блок кодов, воспроизводящий звук.
- •Программа "SOUND"
- •Ввод параметров при помощи оператора INPUT.
- •КАК ЭТО ДЕЛАЕТСЯ!
- •RANARAMA
- •Техническое задание.
- •Предварительные исследования.
- •1. Дизайн экрана.
- •2. Раскладка оперативной памяти.
- •3. Упаковка данных.
- •4. Специальные алгоритмы.
- •5. Проверка концепции.
- •Дизайн программы.
- •Машинный код.
- •Звук и музыка.
- •Одноступенчатая модуляция.
- •Пилообразная модуляция
- •Треугольная модуляция
- •Двуступенчатая модуляция
- •Программа.
- •СОВЕТЫ ЭКСПЕРТОВ
- •FLYER FOX
- •COBRA FORCE
- •THUNDER BLADE
- •SANXION
- •AIR WOLF
- •1943 THE BATTLE OF MIDWAY
- •THE DARK WHEEL
- •ГЛАВА 3.
- •ГЛАВА 4
ОШИБКИ ПЗУ
Обзор по материалам зарубежной печати
В этой статье рассмотрены ошибки и неточности, имеющиеся в ПЗУ "СПЕКТРУМА". Может быть не все они, строго говоря, и являются ошибками, а просто особенностями компьютера, но о них надо знать и уметь обходить в тех случаях, когда они могут помешать нормальной работе.
1. Ограничение по использованию регистровой пары IY.
Эта ошибка (неточность) связана с тем, как в "Спектруме" обрабатываются маскируемые прерывания. Вы знаете, что обычно компьютер 50 раз в секунду приостанавливает исполнение своей текущей программы и обращается по адресу 0038H = 56 DEC для запуска процедуры обработки маскируемого прерывания. Эта процедура увеличивает на единицу показания системных часов компьютера (трехбайтную системную переменную FRAMES) и вызывает подпрограмму сканирования клавиатуры в поисках нажатой клавиши. Благодаря этому и возможен диалог между Вами и компьютером.
Ошибка связана с тем, что увеличение на единицу системных часов производится некорректно. Младшие два байта увеличиваются командой INC HL и с ними все в порядке, но когда они переполняются и надо увеличить старший байт, расположенный по адресу 5С7АН (33674), для этого используется команда процессора
INC (IY+40)
Программист, который писал эту процедуру, предполагал, что во время ее работы в регистровой паре IY должно быть значение 5С3АH (23610) указание на системную переменную ERR NR. в принципе так оно и должно бы быть.
Когда вы вызываете подпрограмму, написанную в машинном коде с помощью RANDOMIZE USR nn, процедура калькулятора, занимающаяся обработкой функции USR nn (она расположена по адресу 34В3Н) автоматически сохраняет на стеке адрес 2D2EH. Поэтому, когда Вы вернетесь по RET из своей подпрограммы, то попадете сначала в адрес 2D2BH (процедура STACK_BC). Здесь восстанавливается нормальное содержимое пары IY = 5C3AH.
Таким образом, у Вас все было бы в полном порядке, если бы не одно "но". Ведь во время работы самой Вашей процедуры тоже может пройти системное прерывание. И если Вы изменили содержимое IY, то вместо приращения системных часов получите что угодно.
Ошибка ПЗУ состоит в том, что в процедуре обработки маскируемого прерывания следовало бы выставлять в IY значение 5С3А, а только потом наращивать старший байт системных часов, а перед выходом восстанавливать в IY Ваше значение.
Достаточно обидно иметь в своем распоряжении регистровую пару IY и не иметь возможности ею воспользоваться. И пользоваться ею можно, если при этом соблюдать некоторые меры предосторожности.
1.Если Вы намерены использовать регистровую пару IY, то возьмите себе за правило прежде, чем что либо изменять в этой паре, отключать системные прерывания командой процессора DI DISABLE INTERRUPTS, а перед выходом из процедуры восстанавливать их командой EI ENABLE INTERRUPTS.
2.Может быть, Вам захочется даже создать свою собственную процедуру для обработки прерываний.
2. Особенности регистровой пары H'L' (альтернативной).
Эта ошибка коснется тех, кто программирует в машинных кодах, а еще точнее тех, кто в своих программах объединяет БЕЙСИК и машинный код, а так поступают очень многие.
Они пишут логику программы на БЕЙСИКе, а операции, требующие большой скорости, пишут в машинном коде. Вероятность споткнуться об эту ошибку практически стопроцентная. Рано или поздно она испортят Вам кровь, хотя избежать ее очень просто.
В двух словах, суть состоит в том, что если Ваша процедура, написанная в маш. коде изменит содержимое регистровой пары H'L' (альтернативной), то в БЕЙСИК Вы уже не вернетесь и программа сбросится или зависнет.
Почему так происходит? Чтобы ответить на этот вопрос, надо знать, как происходит вызов пользовательских машиннокодовых процедур. Вы конечно знаете, что они вызываются командой RANDOMIZE USR nn, где nn адрес ее старта. В принципе вместо RANDOMIZE USR может использоваться RESTORE USR, PRINT USR и т.п., сейчас нам это все равно. Суть состоит в том, что когда интерпретатор БЕЙСИКа встретит USR nn, то он должен рассчитать чему равно nn и для этого вызывает встроенный калькулятор. Это делает процедура ПЗУ, которая занимается расчетом выражений. По адресу 2756Н она содержит вызов калькулятора, а по адресу 2758Н выход из калькулятора.
При вводе в калькулятор содержимое вершины машинного стека (а это есть адрес возврата из калькулятора) запоминается в альтернативной регистровой паре H'L'. Это делает процедура, находящаяся по адресу 3362H.
Затем процедура калькулятора, занимающаяся обслуживанием функции USR nn (34B3H) помещает на вершину стека адрес 2D2Bh и адрес "nn".
По команде RET со стека снимается адрес "nn" выполняется переход в Вашу машиннокодовую процедуру.
Когда она отработает, по ее команде RET со стека снимется адрес 2D2BH и выполнится переход по этому адресу в ПЗУ. Мы писали, рассматривая предыдущую ошибку о том, что расположенная там процедура восстанавливает "стандартное" значение в регистровой паре IY, но она ничего не делает, чтобы восстановить содержимое альтернативной пары H'L', a ведь она тоже могла быть нарушена при исполнении пользовательской процедуры.
Таким образом, исполнение пользовательской процедуры в машинных кодах начинается с вызова системного калькулятора для расчета адреса старта, а кончается выходом из него. Выход из калькулятора производится помещением на стек того, что хранилось в H'L' и переходом по этому адресу. Это делает процедура, обслуживающая команду калькулятора end calc, расположенная по адресу 369ВН. И содержаться в этот момент в H'L' может только адрес 2758H.
Итак, если Ваша процедура нарушает содержимое регистровой пары H'L' (альтернативная) и Вы рассчитываете вернуться в БЕЙСИК, то потрудитесь перед выходом из процедуры восстановить в этой паре значение 2758Н, иначе ничего у Вас не получится.
3. Особенности пользовательской функции FN.
Недоразумение, связанное с пользовательскими функциями может коснуться и тех, кто программирует на БЕЙСИКе и тех, кто программирует в машинном коде, но скорее всего с ним столкнутся опять те же энтузиасты, которые используют и БЕЙСИК и машинный код одновременно, причем пользуются для передачи параметров из БЕЙСИКа в маш. код пользовательскими функциями. Это весьма удобный и прогрессивный метод и мы подробно осветили его в первом томе, посвященном графике "Элементарная графика".
Суть этой ошибки состоит в том, что если во время исполнения пользовательской функции произойдет какое либо перемещение программной области БЕЙСИКа вверх или вниз, то будет выдано сообщение C; Nonsense in BASIC.
Конечно, не так то просто выполнить перемещения БЕЙСИК области и "нарваться" на такую ошибку, но это вполне возможно, если Вы используете USR внутри вашей функции.
На практике это может означать вот что. Если Вы, например, зададите пользовательскую функцию FN D(m,n) = USR NN, предназначенную для удаления из БЕЙСИК программы строк m и n, то она у вас работать не сможет.
Причина появления ошибки в статическом характере системной переменной CH ADD (23645=5C5DH), которая при работе интерпретатора содержит адрес следующего
интерпретируемого символа. На время исполнения пользовательской функции она "сохраняет" свое состояние на стеке и, если во время работы функции все адреса, имеющие отношения к БЕЙСИКУ "поплывут", то после окончания ее работы интерпретатор не сможет продолжить исполнение БЕЙСИК программы.
4. Ошибка деления.
Эта ошибка встречается настолько часто, что о ней даже и не говорят, как об ошибке деления, а считают ее ошибкой округления. Однажды в разделе "ФОРУМ" мы отвечали на письмо читателей, связанное с этой ошибкой (см. "ZX РЕВЮ 91, с. 222).
Кратко проиллюстрировать ее можно на примере:
IF 1/2 <> 0.5 THEN PRINT "Ku Ku"
Попробовав, Вы сами убедитесь, что 1/2 не равна 0.5.
Конечно, в инженерных расчетах следует вводить понятие точности вычислений и сравнивать действительные числа между собой только в пределах установленной точности, но все таки где то что то в ПЗУ не совсем то, раз компьютер выдает такие непонятные результаты.
Ошибка содержится в процедуре калькулятора, выполняющей деление и связана с неправильным округлением результата. Не вдаваясь в подробности как происходит деление двух действительных чисел, скажем только, что процедура работает с 32 мя битами, что и определяет точность числа. Но "за кадром" она учитывает еще 33 ий и 34 ый биты для правильного округления. Так вот, именно при добавлении 34 го бита и происходит ошибка он не учитывается из за неправильного перехода в адресе 3200Н. Там записана команда JR Z, 31E2, а должно быть JR Z, 31DB.
Наилучший путь обхода установить требуемую точность для своих расчетов, например:
LET eps = 0.0000001
и затем вместо
IF X = Y
употреблять:
IF (X Y) < eps
5. Ошибка " 65536".
Это довольно известная ошибка. Она легко вызывается оператором:
PRINT INT( 65536)
который дает 1.
Причина скрыта в процедурах калькулятора, которые работают с пятибайтной формой представления чисел. Одни из них считают, что целые числа могут быть только в диапазоне от 65535 до +65535.
Некоторые, например процедура, выполняющая сложение, полагают, что и 65536 тоже допустимое целое число, в частности, возможно, что сложив 65000 и 536, можно получить число 65536, которое внутри компьютера будет представлено не как действительное, а как целое число.
Процедура же INT одна из тех, которые " разоблачают" эту двусмысленность.
В известной книге Я. Логана и Ф. О'Хары "The Complete SPECTRUM ROM Disassembly" подробному разбору этой ошибки посвящена целая глава приложения. Объяснения достаточно мудреные для непрофессионалов и мы отошлем тех, кому эти знания существенно важны, к этой книге.
6. Ошибка оператора PLOT.
Может быть, это и не ошибка в том смысле, что к фатальным последствиям она не приведет. Дело в том, что если в операторе PLOT X,Y Вы зададите координаты X и Y отрицательными числами, то все равно получите точку на экране.
На самом деле получается так, что команда PLOT печатает точку не в координатах X и Y, а в координатах ABS(X),ABS(Y). Причина в том, что процедура ПЗУ PLOT (22DCH)
вызывает процедуру, перемещающую целые числа из вершины стека калькулятора в регистровую пару BC (процедуру STK_TO_BC 2307H). Но после того, как STK_TO_BC отработает, не учитывается, что она еще поместила в регистровую пару DE знаки тех чисел, которые пошли в BC, и при возвращении в процедуру PLOT надо было бы проверить DE на знак, что не было сделано.
7. Ошибка первого экрана в компьютерах 128К.
Мы уже писали об этой ошибке в предыдущем выпуске "ZX РЕВЮ" на стр. 156 159. Напомним, что 128 килобайтные машины имеют две экранных области памяти. Нулевой экран расположен в обычных адресах 4000Н, а дополнительный первый экран в адресе 7С000Н. Их можно переключать. Команда POKE 23388,24 включит первый экран, а команда POKE 23388,16 включит нулевой экран.
Ошибка происходит в тех случаях, когда пользователь работает с верхними областями памяти этой машины, как с электронным RAM диском и сохраняет в ней данные в виде многочисленных файлов. Файлы "располагаются" в памяти снизу вверх и в это же время сверху вниз в памяти растет каталог этих файлов. В компьютере ничего не сделано для того, чтобы каталог или сами файлы не "перехлестнулись" с первым (дополнительным) экраном.
Чтобы этого не произошло, не храните более 216 файлов, как бы малы они не были, чтобы экран не нарушился каталогом. Вам также нельзя иметь в сумме более 64K данных в этих файлах, иначе экран 1 будет испорчен самими файлами.
(Окончание в следующем выпуске).