ZX Занимательности
а) Добавление новых команд BASIC
В этой части будет дан лишь краткий теоретический обзор того, как можно добавить новые команды BASIC к уже существующим. Чтобы создать новую команду, необходимо знать машинный язык процессора Z80 и принципы работы операционной системы самого компьютера. В большинство персональных компьютеров была встроена операционная система, позволявшая создавать собственные команды BASIC и добавлять их к существующим.
Создатели ZX Spectrum не предусмотрели такой возможности. Лишь в операционной системе Interface 1 появилась возможность легко и просто добавлять команды в соответствии со своими потребностями.
В I-1 есть системная переменная VEKTOR, отвечающая за эти операции.
При создании новой команды важно, чтобы она вызывала ошибку и при проверке синтаксиса, и при выполнении. Вот несколько примеров, как этого можно добиться:
POKE 0,1,2— лишний параметр;DRAW 10— пропуск необходимого параметра;PLOT ,10— неверно заданный параметр;CODE— использование функции из E-MODE;!AUTO— добавление новой команды.
В последнем случае команду нужно вводить посимвольно. Для первого символа выберите что-нибудь, не являющееся буквой.
После этого символа курсор перейдёт дальше, и можно будет вводить новую команду посимвольно. После первого символа, который не является буквой, можно вводить и уже существующие ключевые слова BASIC — в этом случае они приобретут новое значение.
Создание новой команды
Чтобы создать и добавить новые команды, необходимо:
- хорошо знать машинный язык процессора Z80;
- знать, как работает операционная система компьютера и как обрабатываются ошибки в дополнительном 8K ROM.
Работа интерпретатора BASIC
Эта часть программы в 16K ROM обрабатывает каждую команду BASIC дважды. Сначала она только проверяет синтаксис, а затем выполняет команду.
Например, если вы хотите добавить к существующей программе одну программную строку с одной командой, весь процесс можно разделить на три этапа:
-
Программист вводит команду (например,
100 PLOT 0,0) в нижнюю часть экрана. Пока он набирает программную строку, она хранится в EDIT BUFFER. После окончания ввода (нажатием клавиши ENTER) строка копируется отсюда в верхнюю часть экрана и вставляется в программу. -
Когда нажата клавиша ENTER, интерпретатор начинает проверять синтаксис только что введённой строки в EDIT BUFFER. Сначала он распознаёт команду
PLOT, затем ищет два числовых аргумента, разделённых запятой. Если они найдены, строка копируется в верхнюю часть экрана и занимает место, определённое её номером.
Затем управление возвращается редактору, и компьютер готов к вводу новой строки. Если при проверке синтаксиса не найдена допустимая команда или необходимый аргумент, будет выведено соответствующее сообщение об ошибке, а программная строка не будет скопирована из EDIT BUFFER. Однако правильный синтаксис команды ещё не гарантирует её успешного выполнения. Например, следующая команда синтаксически правильна, но при выполнении всё же выдаст ошибку:
100 PLOT 200,200
- Выполнение команды начинается с
RUNилиGO TO. Интерпретатор BASIC снова начинает пошаговый разбор и выполняет соответствующую подпрограмму в ROM. В случае ошибки выполнение прерывается и выводится соответствующее сообщение.
Проверка ошибок
Если при проверке синтаксиса или во время выполнения команды возникает ошибка, вызывается подпрограмма по адресу 0008 в 16K ROM. Чаще всего этот вызов выполняется командой:
RST 8
DEFB -N=код ошибки
При обнаружении ошибки во время проверки синтаксиса знак вопроса выводится в месте, где, вероятнее всего, находится ошибка; во время выполнения выводится соответствующее сообщение. Если к компьютеру подключён I-1, процесс обработки ошибки немного меняется.
Переход по адресу 0008 в 16K ROM вызывает переключение ROM. Старый 16K ROM отключается, а новый, дополнительный 8K ROM в I-1 включается, и там продолжается обработка ошибки. Сначала проверяется адрес возврата из подпрограммы, вызвавшей переход по адресу 0008. Этот адрес загружается в регистровую пару HL. Если значение в HL равно нулю, значит, возврат выполняется из подпрограммы 16K ROM, вызванной I-1. Если HL=15FEh, значит, только что завершился поиск канала I-1.
Если код ошибки не совпадает ни с одним из следующих:
NONSENSE IN BASIC
INVALIDE FILE NAME
INVALID STREAM
управление возвращается в основной 16K ROM, откуда будет выведено настоящее сообщение об ошибке. Однако любую из перечисленных ошибок могла вызвать и наша новая команда. Поэтому теперь нужно заново интерпретировать всю строку, в которой обнаружена ошибка.
Сначала система сохранит указатель адреса CH-ADD (5C5Dh) в CHADD- (5CCBh), то есть позицию, до которой дошла интерпретация строки. Это позволит позднее восстановить значение указателя.
Подпрограмма, начинающаяся по этому адресу, восстанавливает значение из CHADD- в CH-ADD, после чего продолжается вывод сообщения об ошибке в 16K ROM. Это означает, что вместо перехода к нашей подпрограмме можно воспользоваться подпрограммой, адрес которой задан в VEKTOR. Достаточно перед выполнением нашей команды записать в VEKTOR начальный адрес подпрограммы, которая проверит правильность синтаксиса, а затем выполнит соответствующую подпрограмму. Обратите внимание: ваши команды не должны начинаться с команд, предназначенных для работы с Microdrive и I-1.
При написании подпрограммы выполнения команды следует учитывать следующее:
- При переходе или вызове подпрограммы вы всегда остаётесь в 8K ROM (все адреса относятся к дополнительному ROM, а не к основному).
- Подпрограмму из ROM I-1 вызывайте командой
CALL, не используйтеHOOK CODE. - Во время выполнения подпрограммы в 8K ROM состояние клавиатуры не считывается, а внутренние часы (
FRAMES) не работают — независимо от того, разрешены прерывания или запрещены.
Внутренние часы в это время использовать нельзя.
А считывание клавиатуры вам придётся обеспечить самостоятельно из программы.
— Использование процедуры перезапуска даёт эффект, отличный от процедуры из ПЗУ на 16 КБ.
Материал подготовил:
Brada Jožef
Bajmočka 18
24220 Čantavir
б) Звуковые эффекты
Из Majdanpeka нам прислал DARKO две программы, которые создают определённые звуковые эффекты.
Вот эти программы:
10 FOR n=50000 TO 50040:READ a:POKE n,a:NEXT n
20 DATA 17,152,2,6,10,197,58,
30 RANDOMIZE USR 50000:IF INKEY$="" THEN GO TO 30
Добавив следующую строку к предыдущей программе, получим эффект жужжания:
25 POKE 50000,17:POKE 50001,1:POKE 50002,23
Материал подготовил:
Radulović Darko
O.Š. Debeli Lug
19250 Majdanpek
в) Ошибка загрузки с кассеты?
Наверняка с вами бывало такое: вы получали кассету с программами (кто-то называет её кассетой с играми), но некоторые программы не удавалось загрузить. Обычно компьютер зависал при запуске или позднее, а иногда мог перезагрузиться.
Вы проверяете такую программу у соседа, который тоже пользуется «Спектрумом», — у него она работает.
Вы сразу подозреваете свой магнитофон и пробуете настроить азимут, отрегулировать громкость, подвигать эквалайзер…
Но это не помогает, и в конце концов вы, явно озадаченные и раздосадованные, решаете купить новый магнитофон. Вы нетерпеливо садитесь, вставляете кассету в магнитофон, нажимаете PLAY — начинается загрузка. Доходите до того места, на котором компьютер раньше зависал с этой программой, но, к вашему удивлению, программа снова зависает.
Дело не в магнитофоне и не в программе, а в самом ПЗУ вашего Spectrum. Поскольку Spectrum выпускали многие производители, различались и ПЗУ. Одни добавляли команды, другие вместо сведений об авторских правах вписывали своё имя, третьи переводили сообщения об ОШИБКАХ на сербохорватский или немецкий и вносили другие подобные изменения в ПЗУ (посмотрите на PNP-electronic в молодые годы).
Поэтому некоторые данные в памяти не совпадают с ПЗУ, то есть с теми 16 КБ машинного кода в ПЗУ, состоящего из различных процедур, и программа не может нормально с ним взаимодействовать.
Такая проблема возникает и при использовании некоторых модулей EPROM и интерфейсов, которые производят как у нас в стране, так и по всей Европе. Проще говоря, ПЗУ одного производителя может оказаться несовместимым с интерфейсом другого производителя. Обычно эту проблему решают заменой ПЗУ в вашем любимом сервисном центре. Как правило, вы делаете это только тогда, когда подключаете оборудование через интерфейс. Для Spectrum вышло 10 000 программ — игр и служебных программ (по неофициальным данным, около 15 000), так что примерно десять программ, то есть около 0,7%, могут не работать. Поэтому менять ПЗУ невыгодно.
Материал подготовил:
Čanković Srđan
XII Voj. ud. brigade 59
25000 Sombor
Поделитесь вашим мнением о статье