Надо ли объяснять какое значение имеет постоянное запоминающее устройство (ПЗУ) компьютера. B системе Синклер-Спектрум объем ПЗУ составляет 16 килобайт, расположено оно в нижних адресах памяти от адреса 0000 до 3FFF, что в десятиричной системе может быть записано как от 0 до 16363.
Содержимое ПЗУ составляет одна очень сложная и сравнительно крупная программа. Ее называют монитором, и многое в компьютере происходит под ее управлением. Она организует опрос клавиатуры, ввод/вывод программ с магнитофона, управляет выдачей информации на экран и принтер, весь диалог, который Вы в БЕЙСИКе ведете с компьютером, на самом деле ведется с этой программой. Монитор может еще очень и очень многое. Те, кто хорошо знают эту программу, могут использовать ее процедуры в своих программах, что позволяет сокращать время при разработке новых программ и повышать их эффективность.
Мы имеем очень много писем с просьбой рассказать о ПЗУ компьютера, объяснить назначение и особенности работы некоторых входящих в него процедур. Выполняя многочисленные просьбы наших читателей, мы начинаем сегодня печатать с продолжением свою разработку "СЕКРЕТЫ ПЗУ".
Задача, которую мы поставили, выглядит серьезной. Дело в том, что основным первоисточником является книга д-ра Яна Логана и д-ра Фрэнка О'Хары "THE COMPLETE SPECTRUM ROM DISASSEMBLER". Эта книга вполне может считаться библией программиста на "СПЕКТРУМЕ", но ее внушительный объем (порядка 450 машинописных страниц в русскоязычном переводе) делает невозможный для нас ее распространение в рамках разумных цен.
Пытаясь совместить желаемое и возможное, мы сделаем все, что сумеем, чтобы дать Вам в этом году полный обзор системного ПЗУ компьютера, для большинства наиболее употребимых процедур мы дадим не только точки входа, но и условия обращения к ним, некоторые наиболее интересные и поучительные конструкции будут детально разобраны и прокомментированы, а для прочих мы укажем начало, конец и конечно же назначение процедуры.
Программы, содержащиеся в ПЗУ очень широко общаются с областью системных переменных "СПЕКТРУМА". Названия системных переменных при этом мы будем указывать точно так, как это сделано в книге Виккерса "Программирование на языке БЕЙСИК для компьютера СИНКЛЕР ZX СПЕКТРУМ", те же названия системных переменных были применены нами в нашей разработке "Большие возможности вашего СПЕКТРУМа".
Поскольку изучая ПЗУ вам необходимо знать основы программирования в машинных кодах и на языке АССЕМБЛЕРа, реальную помощь Вам может оказать наша разработка "Первые шаги в машинных кодах", а если и после этого какие-либо нюансы будут ускользать от вас, то многие программистские приемы освещены в нашей книге "Практикум по программирования в машинных кодах". Эти разработки - базовые. Не сделав их, мы не смели и приближаться к тому, чтобы начать освещение системного ПЗУ компьютера.
Монитор "СПЕКТРУМа" содержит три основные части:
1. Процедуры управления вводом/ выводом.
2. Интерпретатор БЕЙСИКа.
3. Вычислительные процедуры.
Поскольку эти части весьма значительны, мы рассмотрим монитор, условно выделив в нем 10 разделов.
1. Раздел инициализации.
2. Обслуживание клавиатуры.
3. Обслуживание звукового динамика.
4. Работа с магнитофоном.
5. Поддержка экрана и принтера.
6. Процедуры исполнения команд.
7. Интерпретатор команд и БЕЙСИК-строк.
8. Расчет выражений.
9. Арифметические процедуры.
10. Встроенный калькулятор.
1. ПРОЦЕДУРЫ ИНИЦИАЛИЗАЦИИ
0000-0007 - START.
Процедура запускается при включении компьютера в сеть, после нажатия кнопки RESET, после команды RANDOMIZE USR 0. Она выставляет вершину физической памяти компьютера FFFF в регистре DE, обнуляет аккумулятор и делает переход к процедуре START/NEW по адресу 11CB.
0006-000F - ERROR-1.
К этой процедуре происходит обращение, когда интерпретатор БЕЙСИКа фиксирует ошибку. Процедура извлекает адрес возникновения ошибки из системной переменной CH_ADD и выставляет его в указателе (системной переменной) X_PTR, после чего делает переход на процедуру обработки ошибки ERROR-2 по адресу 0053.
0010-0012 - PRINT-A-1.
Точка входа для печати символа на экране или на принтере, при входе код печатаемого символа должен содержаться в регистре A процессора. Процедура не делает ничего, просто передает управление процедуре PRINT-A-2, которая находится по адресу 15F2 и действительно занимается печатью.
0013-0017 - не используются.
0018-001В - GET-CHAR.
Процедура принимает из системной переменной CH_ADD код символа, который в настоящий момент обрабатывается интерпретатором БЕЙСИКа и помещает его в аккумулятор процессора.
001C-001F - TEST-CHAR.
Проверяет, соответствует ли данный код печатному символу или нет. Если да, то происходит возврат в вызывающую процедуру. Если нет, то работа продолжается. Для проверки TEST-CHAR использует обращение к процедуре SKIP-OVER, находящейся в 007D.
0020-0024 - NEXT-CHAR.
Увеличивает CH_ADD на единицу, т.е. переходит к следующему символу БЕЙСИК-строки и снова идет на проверку в TEST-CHAR (001C).
0025-0027 - не используются.
0028-002А - FP-CALC.
Вызов калькулятора.
002B-002F - не используются.
0030-0037 - BC-SPACES.
Предназначена для выделения в рабочей области БЕЙСИКа свободного места заданного размера. Размер предварительно должен быть установлен в регистровой паре ВС. Собственно здесь вычисления не производятся. Это только точка входа. Управление передается на процедуру RESERVE (169E).
Широко используется БЕЙСИКОМ, особенно при редактировании, например, когда Вы вставляете пропущенные строки или операторы.
0038-0047 - MASK-INT.
Очень важная процедура. 50 раз в секунду процессор выполняет прерывание своей работы и обращается сюда. При работе в БЕЙСИКе это происходит всегда, а при работе в маш. кодах только если прерывание включено. Здесь происходит увеличение системной переменной FRAMES, которая является как Вы внутренними часами компьютера и начинается выполнение KEY-INT.
0046-0052 - KEY-INT.
Отсюда 50 раз в секунду вызывается процедура сканирования клавиатуры KEYBOARD (02BF) с целью определения была ли нажата какая-либо клавиша, когда часы выставлены и клавиатура проверена, управление вновь передается процессору для продолжения той
работы, которой он занимался до прерывания.
0053-0054 - ERROR-2.
Если БЕЙСИК-интерпретатор встретил ошибку, то ее код отправляете на стек, здесь код ошибки снимается со стека и помещается в регистр L процессора.
0055-005Е - ERROR-2.
Код ошибки передается из регистра L в системную переменную ERR_NR, а на стек процессора помещается адрес, определяющий куда надо переходить для обработки ошибки. Он содержится в системной переменной ERR_SP. Возврат выполняется не сразу, а после перехода к процедуре SET-STK (16С5), где очищается стек калькулятора (не путать со стеком процессора, который именуют также машинным стеком).
Дополнительно сообщим, что использование новых нестандартных команд, как например команд МЕГА-БЕЙСИКа, ЛАЗЕР-БЕЙСИКа, БЕТА-БЕЙСИКа и т. п. организовано именно на этой системной переменной ERR_SP. Интерпретатор встречает незнакомый или неожиданный символ, и идет на обработку ошибки по выставленному в ERR_SP адресу, а там его ждут процедуры, которые отличают настоящую ошибку от допустимого расширения, предусмотренного программой.
005F-0065 - не используются.
0066-006F - RESET.
Процедура обработки немаскированного прерывания. Сразу скажем, что в фирменной ПЗУ здесь содержится ошибка.
При получении прерывания по линии INT, процессор обращается к адресу 0066 (это заложено в устройстве процессора), и здесь он должен найти адрес процедуры, которая будет это прерывание обрабатывать.
PUSH AF PUSH HL LD HL, (5CB0)
Запомнили на стеке содержимое этих пар.
В регистр HL загружается содержимое системной переменной, находящейся по указанному адресу - 5C80.
Не ищите эту системную переменную в литературе. Поскольку данная процедура не работает из-за содержащейся в ней ошибки, то и про эту системную переменную нигде не пишут, а говорят, что адрес 5CB0 (23728) якобы не используется. Должна же эта переменная называться NMIADD и содержать адрес, по которому находится программа, обрабатывающая немаскируемое прерывание.
LD A,H ; Проверка содержимого
OR L ; HL на 0.
JR NZ, 0070 ; ОШИБКА! Здесь должно быть JR Z,0070. Должно быть так, что если в NMIADD
стоит 0, то переход в 0070 и оттуда возврат, ничего не сделав. А если не 0, то переход по адресу из NMIADD.
JP (HL) ;На самом же деле все происходит наоборот: если 0, то происходит переход по
адресу 0, т.е. системный сброс компьютера, а если не 0, то возврат, ничего не сделав.
0070-0073 - NORESET.
POP HL ; Восстановление содержимого
РОР AF ; этих пар.
RETN ; Возврат после обработки немаскированного прерывания.
0074-007С - CH_ADD+1. Процедура выполняет переход к следующему интерпретируемому символу, увеличивает на единицу системную переменную CH_ADD и вводит новый символ в аккумулятор,
007D-0094 - SKIP-OVER.
При входе сюда в регистре A содержится код символа, который сейчас обрабатывает интерпретатор БЕЙСИКа. Проверяется является ли он нормальным печатным символом или управляющим кодом, в первом случае - возврат, а во втором код анализируется и производится переход к очередному символу или даже через один с выставлением флага переноса или без. Все зависит от того, какой символ был найден.
0095-0204 - таблицы токенов.
Вы, конечно знаете, что ключевые слова в БЕЙСИКе на "СПЕКТРУМЕ" набираются не по буквам, а закреплены за своими клавишами. Здесь в ПЗУ находятся токены этих ключевых слов. Чтобы отделять их друг от друга последний символ каждого токена инвертирован, включением седьмого бита, иначе говоря, к коду последнего символа
прибавлено число 128.
0205-026B - таблицы клавиатуры.
Этих таблиц - шесть для разных режимов, в которых может находиться клавиатура. Они определяют какой символ, токен или управляющий код закреплен за данной клавишей. Более подробно:
0205-022B - когда клавиатура находится в режимах L или С.
022С-0245 - клавиатура в режиме Е. Для буквенных клавиш без нажатия CAPS SHIFT. 0246-02SF - клавиатура в режиме Е. Для буквенные клавиш с нажатой клавишей CAPS
SHIFT.
0260-0269 - управляющие коды, закрепленные за цифровыми клавишами при нажатой клавише CAPS SHIFT.
026А-0283 - символы и токены, закрепленные за клавишами при нажатии клавиш вместе с SYMBOL SHIFT.
0284-026В - клавиатура в режиме Е. Для цифровых клавиш с нажатой клавишей SYMBOL SHIFT.