7. МОНИТОР 16К
Система SP снабжена 16К постоянной памяти, включающей в себя:
1. Операционную систему.
2. Интерпретатор Бейсик.
3. Набор 96 литер.
ROM содержит программу монитора, которая содержит адреса 0000-3FFF (0-16383) и в стандартной системе SP не может быть перемещена из этих адресов. Команда, расположенная по 0-му адресу, является 1 командой, выполняемой после включения питания.
Программа монитора заслуживает изучения по следующим причинам:
1. Подпрограммы монитора всегда доступны для вызова из программ в машинных кодах, написанных пользователем. Это позволяет создавать короткие программы.
2. Программа монитора показывает, как фирма решила определенные проблемы.
3. Программа монитора - это программа в машинных кодах больших размеров и поучительно посмотреть, как можно структурировать большую программу.
Разные части монитора теперь будут обсуждены по очереди, сперва используя системный взгляд, а затем каждую в отдельности.
7.1. СИСТЕМНЫЙ ВЗГЛЯД НА МОНИТОР
Пользователь системы обычно не подозревает, что МП в центре системы работает по программе в машинных кодах, содержащейся в 16K ROM с того момента когда, питание подаётся к системе. Единственным исключением из этого бывает выполнение программы в кодах, написанных пользователем.
Пользователю SP представляется как машина, которая ожидает программную строку Бейсика либо в непосредственном режиме, либо с номером для построения Бейсик программы. Строки Бейсика без номера выполняются немедленно и могут использовать интерпретацию строк из заранее введенной программы. Система SP немного сложна, поскольку интерпретатор вызывает проверку синтаксиса строки, прежде чем записывает её в программную область - вне зависимости от того, выполняется она непосредственно или представляет элемент программы.
Операционная система (ОС)
Изучение программы монитора начинается с программы INITIALIZATION, которая запускается либо после включения питания, либо по переходу к 0-му адресу (RANDOMIZE USR 0).
Инициализация (INITIALIZATION)
Эта программа занимает адреса 0000-0007 и 11CB-12A1. Основными задачами являются проверка наличия памяти и установка системных переменных. Более подробно это будет рассмотрено позднее. Программа инициализации заканчивается появлением сообщения SINCLAIR. За этим стартует программа (MAIN EXECUTION). Эта программа занимает адреса 12А2-15АЕ. В системе SP эта программа, как следует из названия, выполняет основные функции в мониторе.
Эта программа вызывает (если необходимо) программы LIST EDITOR и SYNTAX CHEKER, если строка Бейсика добавляется в программную область, в случае непосредственного выполнения строки вызывается программа LINE-RUN, и эта строка интерпретируется - это может включать в себя интерпретацию других строк Бейсика. Затем по возвращению из программы LINE-RUN выдается сообщение.
Таблица сообщений об ошибках находится по адресам 1391-1536. Возврат к началу MAIN EXECUTION приводит к новому вызову программы EDITOR.
Редактор (EDITOR)
Программа занимает адреса 0F2C-10A7. Программа позволяет пользователю поместить строку Бейсика в нижней части Экрана. В действительности строка формируется в области редактирования и затем копируется в дисплейную область.
Пользователь может вводить символы или управлять курсором, и соответствующие подпрограммы вызываются по мере необходимости.
Управляющие курсоры и ENTER вызывают возврат в программу MAIN EXECUTION.
В стандартной системе SP войти в программу EDITOR можно единственно через клавиатуру, и поэтому Программа KEYBOARD-INPUT вызывает программу EDITOR. Этот вызов направляется через информационную область канала.
KEYBOARD-INPUT
Программа занимает адреса 10A8-111C. Эта программа даёт код последней набранной на клавиатуре клавиши, читая его из системной переменной LASTK.
Эта программа выполняет некоторые операции, например, устанавливает флаги CAPSLOCK и графики и получает 2-й байт управляющей клавиши цвета для системной переменной.
_Монитор 16K_
KEYBOARD
Каждые 1/50 секунды прерываются вычисления, и производится сканирование клавиатуры. Существует 5 отдельных программ, связанных с основной программой KEYBOARD, занимающей адреса 02BF-030F. Собственно сканирование клавиатуры выполняет подпрограмма KEY-SCAN (занимает адреса 028Е-02ВЕ). Подпрограмма возвращает соответствующее ключевое значение в регистровую пару DE, которую другие программы клавиатуры используют для получения кода литеры.
PRINT-OUTPUT
В добавление к программам, обсужденным выше, имеется много других, которые также составляют части ОС.
Программа PRINT-OUTPUT располагается в адресах 09F4-0D4C и, возможно, является самой важной среди других программ.
Эта программа в сущности вызывается инструкцией RST 0010. Адрес, помещенный в 09F4, берётся из информационной области канала. RST 0010 определяет, быть ли коду, находящемуся в регистре A, помещенным на TV-экран, или быть напечатанным на принтере. Флаг, определяющий это, в программе повторно тестируется.
В системе SP программа PRINT-OUTPUT очень мощная, поскольку и символы, и управляющие коды выводятся по этой же программе.
В случае вывода на экран телевизора, текущая позиция печати берётся из соответствующих системных переменных, модифицируется и затем снова сохраняется. Позиция печати определяет номер строки и колонки, а также соответствующий адрес в дисплейном файле (верхняя левая точка в поле литеры). Программа PRINT-OUTPUT имеет подпрограммы, которые по необходимости вызываются для передачи. Другие подпрограммы меняют байт атрибутов для той области символов, чье значение содержится в соответствующих системных переменных. Заметьте, что стандартные литеры копируются из набора литер, а символы, определенные пользователем, - из области UDG, в то время как графические вычисляются по мере необходимости.
Подобная операция приводит к передаче формы символа в буфер принтера для последующего вывода на принтер; управляющие символы игнорируются.
В системе SP каждый символ, который печатается на TV-экране или принтере, формируется программой PRINT-OUTPUT. Тот факт, что программа применяется во многих различных случаях, делает программу довольно медленной, но, несмотря на это, и очень полезной.
Интерпретатор Бейсика
Интерпретатор вызывается как для проверки синтаксиса, так и для выполнения строки. По большей части эти программы используют для обеих функций флаг синтаксис/выполнение, чтобы определить какая из операций должна быть выполнена.
Например, в строке LET A=1 сначала проверяется синтаксис, а затем переменной A присваивается значение 1. Поэтому, в таких случаях может быть удобно рассматривать синтаксический анализатор как сумму отдельных функций исполнителя строк, несмотря на то, что реально этого нет.
Интерпретатор состоит из нескольких частей:
1. Таблица команд располагается в области 1A48-1B16. В системе SP существует 50 команд и таблица команд. Она содержит класс команд, символы разделители и адреса программ выполнения команды;
2. Управляющая программа располагается в адресах 1B17-1CEE и содержит команды, позволяющие рассматривать операторы Бейсика один за другим, как требуется в программе. Точкой входа в синтаксический анализатор является адрес 1B17, а в исполнитель строки - 1B0A;
3. Программы класса команд располагаются в адресах 1C01-1CDD и главным образом занимаются анализом параметров команды Бейсика. Например, команда NEXT относится к классу 4, как требующая за собой простую переменную. Команда POKE относится к классу 8, как требующая за собой 2 числовых выражения, разделенных запятой;
4. Программы команд. Большинство программ команд располагаются в адресах 1CDE-24FA. Программы команд, связанные с процедурами ввода-вывода, обычно входят в ОС как часть программы монитора.
Программы команд существуют для каждой из 50 команд Бейсика, и выполнение этих программ и есть собственно работа интерпретатора. Интерпретация операторов Бейсика может быть проиллюстрирована следующими примерами.
Рассмотрим оператор CLS, интерпретация которого проста. Сначала рассматривается команда, не имеющая операндов, по таблице команд находится адрес (0D6B). Программа команды выполняется, вызывая очистку экрана дисплея и установку атрибутов байтов. Программа управления затем переходит к интерпретации следующего оператора. Следующий оператор 20 GO TO 50. В этом случае переменная GO TO программы располагается по адресу 1E67. В этой программе операнд оператора специфицируется и помещается в системную переменную NEWPPC так, что управляющая программа рассматривает оператор строки 50 как следующий оператор для интерпретации.
В строке 20 GO TO 50 символы между командой Бейсика GO TO и возвратом каретки (:) рассматриваются как выражение. В рассматриваемом случае преобразование выражения просто, так как значение, полученное преобразованием литер 5 и 0 даёт десятичный результат 50. Однако в SP интерпретатор Бейсика имеет и преобразователь выражений, который будет рассмотрен ниже.
Преобразователь выражений
Эта программа занимает адреса 24F8-28B1. В SP результат преобразования выражения может быть числовой
или строковый. Числовой результат возвращается как плавающее значение в 5-ти верхних байтах калькуляторного стека, в случае строкового результата 5 байтов представляют собой набор параметров определяющих строку.
Выражение преобразуется слева направо. Операция, имеющая высший приоритет, выполняется перед операцией с подобным или низшим приоритетом. Определенные операции, такие как FN, RND, PI, INKEY$, BIN, SCREENS, ATTR, POINT выполняются без использования преобразователя выражений, но для всех других он используется. Когда переменная используется в выражении, преобразователь выражений получает соответствующее значение для переменной, вызывая программу идентификации этой переменной.
Программы переменных
Этот набор программ занимает адреса 28B2-2ACB. Эти программы возвращают текущее значение или параметры заданной переменной в область переменной. В случае массива правильный элемент или элементы должны быть определены прежде, чем правильные значения могут быть возвращены, и в случае, если используется часть строковой переменной, её параметры должны быть соответствующим образом подготовлены.
Смешанные арифметические программы
Часть программы монитора, которая занимает адреса 2C88-2F9A, содержит серию арифметических программ. Самые важные из них - STACK-ВС (по адресу 2D2B), которая преобразует текущее значение, содержащееся в регистровой паре ВС, в плавающее значение наверху калькуляторного стека, и PRINT-FP (по адресу 2DE3) которая берёт верхнее значение калькуляторного стека, преобразует его в 10-ную форму и печатает на TV-экране или принтере.
Калькулятор
Это большая и сложная программа, занимающая адреса 2F9B-2FCD. Обычно выполняется по команде RST 0028, в свою очередь, выполняющую переход по адресу 3358. По существу калькулятор состоит из 66 подпрограмм, каждая из которых выполняет различные действия. Вызов этих подпрограмм осуществляется не по команде CALL, а использованием литералов с 16-ным значением 00-41. Например, литерал 04 эквивалентен CALL 30CA и приводит к тому, что 2 верхних значения калькуляторного стека замещаются одиночным значением, являющимся их результатом. Следовательно, 04 является литералом, обеспечивающим умножение. Эти литералы включаются в программу как байты данных (DEFB - определение байтов), следующие за командой RST 0028. Последний DEFB всегда имеет значение 38, которое выполняет завершающие операции и т.о. является возвратом из калькулятора.
Подпрограмма TAN
37DA |
EF |
RST 002 8 |
вызов калькулятора. Значение X уже в |
|
|
|
|
калькуляторном стеке. |
37DB |
31 |
DEFB |
+31 |
дублирование X, X |
37DC |
IF |
DEFB |
+ 1F |
SIN X |
37DD |
01 |
DEFB |
+ 01 |
обмен SIN X, X |
37DE |
20 |
DEFB |
+2 0 |
COS X |
37DF |
05 |
DEFB |
+ 05 |
деление - TAN X |
37E0 |
38 |
DEFB |
+38 |
конец |
37E1 |
C9 |
RET |
|
возврат к обычным машинным кодам и верхнее значение калькуляторного стека поменялось с X на |
TAN X.
Причина включения этой специальной системы использования команды RST 0028 со следующими за ней литералами состоит в том, что это сокращает программу в машинных кодах. Пример, приведенный выше, использует только 8 адресов памяти, в то время как использование 5-ти команд CALL и команд JP потребовало бы 32 адресов.
Можно использовать калькулятор в программах, написанных пользователем, но надо беспокоиться о том, чтобы правильно работать с калькуляторным стеком.
набор литер
Существует "неиспользуемая" область 386E-3CFF, которая предшествует набору литер, занимающих адреса 3D0C-3FFF.
Набор литер содержит 96 форм символов, каждый из которых использует 64 бита.
3D58 DEFB +00 '00000000'
3D59 DEFB +00 '00000000'
3D5A DEFB +08 '00001000'
3D5B DEFB +08 '00001000'
3D5C DEFB +3E '00111110'
3D5D DEFB +08 '00001000'
3D5E DEFB +08 '00001000'
3D5F DEFB +00 '00000000'
т.е. '+'.
Программа Бейсика, которая показывает 2-ные формы, дана следом: 20 FOR A=15616 TO 16376 STEP 8
30 FOR B=0 ТО 7: LET F=PEEK(A+B): GO SUB 300: NEXT В 40 PRINT
_Монитор 16K_
50 PRINT TAB 2;"'"; CHR$(32+(A-15615)/8);"'" 60 INPUT A$ 70 CLS 80 NEXT A 90 STOP
300 REM BINARY OFF F 310 FOR N=7 TO 1 STEP -1 320 LET P=2AN
330 PRINT CHR$(48+INT(F/P))
340 LET F=F-INT(F/P)
350 NEXT N
360 PRINT INT F
370 RETURN
Строка этой программы позволяет пользователю последовательно проследить формы всех 96 литер одна за
одной.
7.2. РАЗЛИЧНЫЕ ЧАСТИ ПРОГРАММЫ МОНИТОРА
Программа монитора теперь будет обсуждена секция за секцией в том порядке, в каком она занимает ROM. 0000-0007 RST 0000. Первоначальный пуск. Запрещаются маскируемые прерывания, очищается регистр A, регистровые пары, DE загружаются значением +FFFF (верхнее значение адреса RAM) и происходит переход по адресу 11CB.
0008-000F RST 0008. Программа ошибки. Машинный стек очищается и выдается соответствующее сообщение.
0010-0012 RST 0010. Точка входа программы PRINT-A. Осуществляется переход по адресу 15F3. 0018-0024 RST 0018 и RST 0020. Получает текущий символ, на который указывает CH-ADD как следующий. 0028-0029 RST 0028. Переход по адресу 335B, который является стартовым адресом калькулятора. 0030-0037 RST 0030 BC-SPACE. Переход по адресу 169E для выделения места в рабочей области. 0038-0052. Программа обработки маскируемых прерываний. Часы реального времени обновляются, и осуществляется сканирование клавиатуры вызовом по адресу 02BF.
0066-0070. Программа обработки немаскируемых прерываний, которая перезапускает систему, если по адресу 5CB0 записан 0.
0095-0204. Таблица ключевых слов. Программа показывает эту таблицу: 10 RET POKE TABLE PRINTER 20 FOR A=149 TO 516 30 LET B=PEEK A
40 IF B<128 THEN PRINT CHR$ B: GO TO 60 50 PRINT CHR$(B-128) 60 NEXT В
0205-028D. Таблица клавиш. Существует 6 таблиц, по 1 на каждый из возможных режимов. Наиболее важна 1-ая таблица (0205-022B), которая содержит значения в коде ASCII для больших букв и цифр;
028Е-02ВЕ. Программа KEY-SCAN. Значение клавиши возвращается в регистровую пару DE Флаг 0 сбрасывается, если одновременно нажато слишком много клавиш. Обычно регистр E указывает номер клавиши (16-ное 00-27), а регистр D указывает, какой регистр клавиши был набран.
028F-03B4. Подпрограмма KEYBOARD, Набор подпрограмм, которые осуществляют возможность повторения и декодируют значения клавиш для получения требуемого кода литеры. Если клавиша нажата, то её код копируется в системную переменную LIST-K и бит 5 FLAG устанавливается, чтобы сигнализировать о наличии нового кода.
03B5-03F7. Подпрограмма BEEPER, При входе регистровая пара HL содержит высоту тона требуемой ноты и регистровая пара DE содержит её. Значение длительности абсолютно и должно быть увеличено так же, как и значение высоты тона уменьшено, для того, чтобы иметь повсюду одинаковую длительность.
03F8-046D. Программа команды BEEP. Эта программа широко использует калькулятор для изменения длительности и высоты тона в соответствии со значением регистровых пар HL и DE. Существует таблица 12 плавающих чисел (016E-04A8) для получения правильных значений полутонов. 04AA-04C1. По ошибке эти адреса содержат подпрограмму для ZX-81.
04C2-09F3. Программа команд SAVE, LOAD, VERIFY и MERGE. Важные части этой секции программы монитора следующие:
04С2-053Е. Программа SAVE-BYTES, передает количество байт, указанных в регистровой паре DE, начиная с адреса, хранящегося в регистре IX на магнитофон вместе с начальным адресом и байтом четности.
053F-0555. Подпрограмма окончания SAVE/LOAD.
0556-0604. Подпрограмма LOAD-BYTES. Загружает или сопоставляет данные, количество которых указано в регистровой паре DE с магнитофона регистровая пара IX указывает 1-ый адрес загрузки. Флаг переноса сброшен для операции верификации и установлен для операции загрузки или добавления SAVE-BYTES и LOAD-BYTES. Используется как для работы с заголовком, так и с блоком данных.
_Монитор 16K_
0605-075F. Точка входа во все подпрограммы находится по адресу 0605, и эта часть имеет дело с конструкцией деталей заголовка в рабочей области и является общей для всех 4-х команд Бейсика. 0760-096F. Эта часть связана с загрузкой, верификацией и добавлением и вызывает LOAD-BYTES. 0970-09А0. Эта часть связана с сохранением и совсем проста. Канал, предназначенный для печати в нижней части экрана, открывается, и появляется сообщение "пустите ленту". Затем появляется сообщение "нажмите любую клавишу" и ожидается нажатие. После этого выводится заголовок, и ещё через секунду - блок данных.
09A1-09F3. Сообщения, связанные с работой магнитофона. 09F4-0D4C. Программа PRINT-OUTPUT для печати на принтер. Бит 1 FLAGS должен быть установлен и сброшен для вывода на TV-экран. Важными частями этой секции монитора являются:
09F4-0A0E. Символы, которые могут быть напечатаны, отделяются от управляющих символов. В любом случае ищется текущая позиция для печати - смотри 0BC3. 0А11-0А22. Таблица управляющих символов.
0A23-0AD8. Различные программы, имеющие дело с управляющими кодами.
0ADC-0B02. Важная подпрограмма STORE. Текущая позиция сохраняется в соответствующих системных переменных. Позиция печати может указывать на основную часть экрана, нижнюю часть экрана или буфер принтера.
0B03-0B23. Такая же важная подпрограмма FETCH.
0B24-0BDA. Подпрограмма печати литеры PRINT-ANY. Эта особенная подпрограмма представляет собой весьма важную часть программы печати символов в системе SP. На выводе регистровой пары HL содержится начальный адрес места, где должен быть напечатан символ (DF-CC или эквивалент), регистровая пара BC содержит текущее значение строки и колонки (5-FCSN или эквивалент), и регистр A содержит код символа. Начальный адрес формы литеры находится или в наборе литер, или в области их, или в области калькуляторной памяти, где находятся специально созданные графические литеры. P-FLAG также анализируется, чтобы увидеть в режиме OVER или INVERSE (или в обоих сразу) должен быть напечатан символ.
0ВВ7-0ВС4. В этой подпрограмме форма символа копируется из памяти или в дисплейную область, или в буфер принтера.
0BDB-0C09. Программа установки атрибутов. После того, как символ напечатан, байт атрибутов для символов должен быть установлен. Это включает в себя поиск и формирование значения атрибута и системных переменных ATTR-T, MASK-T, P-FLAG. Все эти значения обрабатываются совместно, и результат значения хранится как новое значение атрибута.
0С0А-0С54. Подпрограмма печати сообщений и ключевых слов. Входной точкой для печати сообщений является 0C0A, а для печати ключевых слов - 0C10. В случае печати сообщений регистровая пара DE содержит начальный адрес таблицы сообщений (значение должно быть более чем 7F), а регистр A содержит номер сообщения (начиная с 0). Все символы печатаются до тех пор, пока не встретится "инверсный" символ. В случае печати ключевых слов команда по адресу 0С10 загружает в регистровую пару DE начальный адрес таблицы ключевых слов 0095.
0C55-0D4C. Подпрограмма SCROLL. Всякий раз, когда символ печатается на экране TV, каждая текущая позиция проверяется для определения необходимости продвижения экрана. Если продвижение необходимо, то печатается сообщение-подсказка, и ожидается нажатие клавиши. 0D4D-0D6A. Программа установки временных цветовых характеристик. Эта важная маленькая подпрограмма используется во многих случаях. Если основная часть экранной области используется, то системные переменные ATTR-P и MASK-P, в системной переменной P-FLAG копируются нечётные биты (постоянные значения) в чётные (временные).
Однако когда используется нижняя часть экрана, системная переменная ATTR-T копируется из переменной BORDER и обнуляется переменная MASK-T. Все биты переменной P-FLAG, хранящие временные характеристики цвета, сбрасываются.
0D6B-0EAB. Программа команды CLS. Операция очистки экрана в SP включает в себя заполнение всех адресов экранной области нулевыми значениями адресов в области атрибутов специфицированными значениями. Программа команды использует подпрограмму CL-LINE (0Е44-0Е67) для очистки 24 строк экранной области. Продвижение экрана реализуется подпрограммой CL-SCROLL (0E00-0E43). 0EAC-0F2B. Программы для принтера.
0EAC-0BCC. Программа команды COPY. 176 точечных линий непосредственно на принтер (так называемый ZX-принтер).
0ECD-0EF0. Подпрограмма COPY-BUFF. Содержимое буфера принтера передается на принтер. 0EF4-0F2B. Собственно программа принтер. 0F2C-10A7. EDITOR. Программа позволяет пользователю создавать строку на Бейсике в редакторской области памяти. При каждом нажатии клавиши печатаемый символ или ключевое слово по программе ADD-CHAR (0F81-0F91) добавляется в редактируемую строку.
0FAC-0FA8. Содержат таблицу для кодов (16-ое 070F) для клавиш редактирования, и секция 0FA9-10A7 содержит различные программы обработки этих клавиш. EDITOR также вызывается из программы команды INPUT и позволяет пользователю создавать входные строки в рабочей области.
10А8-111С. KEYBOARD-INPUT. Подпрограмма собирает значения из LIST-K до тех пор, пока бит 5 FLAGS показывает, что нажата новая клавиша. Если код "печатаемый", то устанавливается флаг переносе и флаг 0.
_Монитор 16K_
Установка флага CAPS LOCK обрабатывается в адресах 10DD-10E5. Бит 3 FLAGS 2 дополняется каждый раз, когда эта, секция выполняется.
Установка MODE, использующая клавишу GRAPHICS и регистр, или SIMBOL SHIFT и регистр, обрабатывается в адресах 10E9-10F3.
Секция 10FA-111С Связана с установкой K-DATA, если была нажата цифровая клавиша.
111D-11B6. Подпрограмма ED-COPY. Редакторская строка или входная строка, построенные в редакторской или рабочих областях этой подпрограммой, высвечиваются на TV-экране.
11В7-11СА. Программа команды NEW. Эта команда выполняет операции системного рестарта, но оставляет без изменения переменные RAMTOP, PRAMT, RASF, PIP, UDG. Она продолжается в INITIALISATION.
11CB-12A1. Программа INITIALISATION. При входе в регистр A содержит значение 0 для полного системного рестарта или FF для генерации NEW.
Основные части программы:
ИСС-HCF. TV-экран становится белым.
11D0-11D9. Регистр I устанавливается на +3F. Регистр используется для генерации TV-сигналов. 11DA-11EF. Программа RAM-CHECK. Тестируются адреса, начиная с 4000 до RAMTOP. При выходе регистр, пара HL содержит адрес последней пригодной для использования ячейки памяти. 11F0-11FF. В случае операции NEW эта секция используется для перезаписи значений P-RAMT, RASP, PIP, UDG. При системном рестарте выполнение этой секции бессмысленно.
1200-1218. Эта часть используется при системном рестарте. Графика пользователя от A до U устанавливается копированием форм из набора литер в область UDG. Переменные PIP, RASP, P-REMT инициализируются.
1219-1234. Системная переменная CHARS устанавливается равной +3000, и организуется машинный стек. Устанавливается режим 1 системы прерываний, регистровая пара IY заполняется 5C3A и разрешаются маскируемые прерывания. С этого момента клавиатура опрашивается каждые 1/50 секунд. 1235-1243. Начальная информация каналов копируется в область каналов.
1244-127B. Инициализируется ряд системных переменных. Например, переменные постоянных характеристик цвета устанавливаются так, чтобы были чёрные чернила, белая бумага и белый бордюр. 127С-1285. Начальные данные потока копируются в первые 14 адресов STRMS. Они представляют потоки от -3 до +3.
1286-12А1. Очищается буфер принтера, очищается экран, и фирменное сообщение печатается в нижней части экрана.
12А2-15АЕ. Программа MAIN EXECUTION. Различные части этой программы будут обсуждены:
12А2-12Е1 - основной цикл для построения и последовательного вывода программы Бейсик. Синтаксис каждой строки проверяется и, если синтаксис правильный, строка копируется в область программ. 12Е2-1302 - непосредственная строка Бейсика, которая прошла проверку на синтаксис, должна быть интерпретирована. Возврат по адресу 1303 завершает интерпретацию независимо от причин. 1303-1390 - соответствующие сообщения появляются на экране, и цикл повторяется с адреса 12AC. 1391-1554 - таблица сообщений об ошибках. Фирменное сообщение находится также в этой таблице. 1555-15АЕ - заключительная часть программы MAIN EXECUTION. Используется для копирования строки из редакторской области в соответствующее место в программной области. При копировании строки с номером, который уже существует, происходит замещение.
15AF-15C5. Начальная таблица данных канала.
15C6-15D3. Начальная таблица данных потока.
15D4-1651. Программа обслуживания канала. Входом в этот набор программ является адрес 15D4. Программа ожидает нажатия клавиши на клавиатуре повторным вызовом подпрограммы KEYBOARD-INPUT до тех пор, пока установлен флаг переноса. Вход 15EF или 15F2 вызывают печать символа. Выход стандартно осуществляется через PRINT-OUTPUT. Первая точка входа используется для печати цифр, вторая для одинаковых символов и ключевых слов.
1652-1654. Подпрограмма ON E-SPACE. Одиночное место выдается в редакторской области или рабочей области для строки Бейсика.
1655-1663. Текущее значение регистровой пары BC показывает, как много места должно быть выделено, а регистровая пара HL указывает, после какого места в памяти должна быть выделена эта область.
1664-168Е. Подпрограмма POINTERS. Все указатели от VARS до STREND при необходимости изменяются.
168F-169D. Подпрограмма сбора номера строки. Для данного адреса начала строки номер строки собирается в регистровой паре DE.
16DE-16AF. Подпрограмма RESERVE. Требуемый размер области делается, доступен в рабочей области.
16B0-16D8. Набор программ очистки. По коду 16В0 очищается редакторская строка, временная рабочая область и калькуляторный стек: в то время как по коду 16С5 очищается только калькуляторный стек.
16DB-16E5. Подпрограмма индексации используется в различных применениях поиска по таблицам.
16Е6-1792. Программа команд CLOSE и OPEN. Открытие канала состоит в помещении отличного от 0 значения в соответствующую переменную STRMS для этого канала. Например: PRINT PEEK 23584 содержит нормальный 0, который показывает, что канал 5 закрыт. Но после OPEN #5,"K" PRINT PEEK 23584 даст 1, и канал теперь открыт. После CLOSE #5,"K" PRINT PEEK 23584 даст 0. Эти программы проверяют, что каналы открываются и закрываются правильно.
1793-1794. В стандартном SP использование команд CAT, ERASE, FORMAT, MOVE приводит к выдаче
сообщения об ошибке - "неверный поток". Эти команды используются с дисководом.
1795-1А47. Программа листинга. Вход 1795 использует MAIN EXECUTION для выработки автоматического листинга, вход 17F5 для LLIST и выход 17F9 собственно для LIST. Различные подпрограммы будут обсуждены:
1855-18B5 - программа печати строки Бейсика. Она вызывается повторно управляющими программами для печати каждой строки Бейсика. Сначала печатается номер строки, затем, если требуется, курсор строки.
18C1-18BC. Эта подпрограмма вызывается в случае необходимости мигающих символов. Окончательно печатаются все символы и ключевые слова.
190E-197F. Подпрограмма LINE-ADDR. Она используется для поиска начального адреса строки Бейсика в области программы.
19B8-19D4. Подпрограмма NEXT-ONE. Используя её, ищется следующая строка Бейсика или следующая переменная.
19D5-19FA. Подпрограмма исправления. Любые исправления, которые необходимо произвести, выполняются этой подпрограммой, сначала исправляется указатель от VARS до STREND, а затем требуемое данное добавляется в конец калькуляторного стека.
1 А1 В. Подпрограмма печати номера. Используется для печати номера оператора Бейсика, или при листинге, или при выводе сообщения. 1А48-1В16. Таблица команд. Существует две таблицы. Первая таблица ссылок для таблицы параметров. Полная таблица параметров приведена ниже.
Таблица параметров
Адрес |
Команда |
Класс команды |
1A7A |
LET |
01-02 |
1A7D |
GO TO |
06 00 |
1A81 |
IF |
06 THEN 05 |
1A86 |
GO SUB |
06 00 |
1A8A |
STOP |
00 |
1A8D |
RETURN |
00 |
1A90 |
FOR |
04-06 TO 06 05 |
1A98 |
NEXT |
04 00 |
1A9C |
PRINT |
05 |
1A9F |
INPUT |
05 |
1AA2 |
DIM |
05 |
1AA5 |
REM |
00 |
1AA8 |
NEW |
00 |
1AAB |
RUN |
03 |
1AAE |
LIST |
05 |
1AB1 |
POKE |
08 00 |
1AB5 |
RANDOMIZE |
03 |
1AB8 |
CONTINUE |
00 |
1ABB |
CLEAR |
03 |
1ABE |
CLS |
00 |
1AC1 |
PLOT |
09 00 |
1AC5 |
PAUSE |
06 00 |
1AC9 |
READ |
05 |
1ACC |
DATA |
05 |
1ACF |
RESTORE |
03 |
1AD2 |
DRAW |
0905 |
1AD6 |
COPY |
00 |
1AD9 |
LPRINT |
05 |
1ADC |
LLIST |
05 |
1ADF |
SAVE |
0B |
1AE0 |
LOAD |
0B |
1AE1 |
VERIFY |
0B |
1AE2 |
MERGE |
0B |
1AE3 |
BEEP |
08 00 |
1AE7 |
CIRCLE |
09 05 |
1AEB |
INK |
07 |
1AEC |
PAPER |
07 |
1AED |
FLASH |
07 |
1AEEE |
BRIGHT |
07 |
1AEF |
INVERSE |
07 |
1AF0 |
OVER |
07 |
1AF1 |
OUT |
08 00 |
Адрес программы, разделители
2AFF
1E67
1CF0
1EED
1CEE
1F23
1D03
1DAB
1ECD
2089
2C02
1BB2
11B7
1EA1
17F9
1E80
1E4F
1E5F
1EAC
0D6B
22DC
1F3A
1DED
17F5 (0605) (0605) (0605) (0605) 03F8 2320 (1C96) (1C96) (1C96) (1C96) (1C96) (1C96) 1E7A
_Монитор 16K_
Адрес Команда Класс команды Адрес программы, разделители
1AF5 |
BORDER |
06 00 |
2294 |
1AF9 |
DEF FN |
05 |
1F60 |
1AFC |
OPEN |
06, 0A 00 |
1736 |
1B02 |
CLOSE |
06 00 |
16E5 |
1B06 |
FORMAT |
0A 00 |
1793 |
1B0A |
MOVE |
0A, 0A 00 |
1793 |
1B10 |
ERASE |
0A 00 |
1793 |
1B14 |
CAT |
00 |
1793 |
Замечание: некоторые адреса программ не находятся в таблице. Такие адреса даны в скобках.
1 В17-1С00. Управляющая программа интерпретатора Бейсик. В случае проверки редактируемой строки на ошибку, вход в программу осуществляется по адресу 1B17, и выполняются следующие шаги:
1. Сбрасывается флаг синтаксиса - бит 7 FLAGS.
2. Любой номер строки проверяется на корректность, используя подпрограмму E-LINE NUMBER по адресу
19FB.
3. Системная переменная, которая считает количество операторов в строке (SUBPPC), устанавливается в 0.
4. Системная переменная ERR-NR устанавливается в FF. Затем по очереди (адреса 1B28-1B3C) на синтаксис проверяется каждый оператор строки. В случае отсутствия синтаксических ошибок выход осуществляется через программу по адресу 1BB3-1BB6.
В случае непосредственной интерпретации строки Бейсика входом служит адрес 1B8A. Флаг синтаксиса - бит 7 FLAGS, должен быть всегда установлен. Затем операторы строки рассматриваются по очереди. Прямой возврат выполняется, если нет больше строк Бейсика для интерпретации. Однако в том случае, когда непосредственный оператор Бейсика содержит такие команды как RUN, GO TO, CONTINUE или соответствующее RETURN или NEXT возможна интерпретация других строк Бейсика прежде, чем возврат будет выполнен после достижения конца программы.
В случае выполнения интерпретации оператора выполняются следующие действия:
1. Определяется команда Бейсика и вычисляется адрес в таблице команд.
2. В таблице параметров определяется первая программа класса команды и затем выполняется.
3. Выполняются следующие программы класса команд или подбираются соответствующие разделители, пока не достигается состояние, при котором адрес программы команды находится, и программа выполняется.
4. Когда интерпретирован последний оператор в строке, рассматривается следующая строка.
1C01-1C0C. Таблица класса команд. Эта таблица используется для поиска основного адреса различных программ класса команд.
1C0D-1CDD. Программа класса команд. Требования, определяемые различными классами команд, могут быть
суммированы так: |
|
класс 00 |
нет других операторов; |
класс 01 |
LET. Требуется переменная; |
класс 02 |
LET. Выражение числовое или строковое; |
класс 03 |
числовое выражение. По умолчанию используется 0; |
класс 04 |
следующая должна быть простая символьная переменная; |
класс 05 |
может быть набор элементов; |
класс 06 |
должно следовать числовое выражение; |
класс 07 |
элементы цвета; |
класс 08 |
должны следовать 2 числовых выражения, разделенных запятой; |
класс 09 |
как для класса 08, но элементам цвета могут предшествовать выражения; |
класс 0A |
должно следовать строковое выражение; |
класс 0B |
программы управления магнитофоном. |
Программы классов команд довольно сложны, и дальше обсуждаться не будут. Однако адреса 1CAD-1CBD, которые содержат часть программы класса 07, представляют собой интерес. Эти адреса содержат программы, которые копируют текущие временные системные переменные в соответствующие постоянные и которые могут вызываться по мере надобности.
1CDE-24FA. Программы команд.
Программы этой секции вновь достаточно сложны и не будут детально обсуждаться. В главе 8, однако, сделаны ссылки на различные программы печати в том виде, в котором они могут вызываться из программ пользователя.
24FB-28B1. Вычислитель выражений. Наиболее интересная программа в SPECTRUME. Вычисление функций, не требующих аргументов, выполняется внутри вычислителя выражений, не выделяясь в отдельные подпрограммы. В результате использования этого метода программист, желающий использовать эти программы - функции, должен обратиться за помощью к вычислителю выражений из программы VAL/VALS калькулятора (см. главу 8 для детализации).
Существует 2 основных момента, связанных с вычислителем функций. Первый из них связан с тем, что программа вычисляет следующее выражение и формирует одиночный результат. Этот результат занимает 5 байтов памяти, которые хранят число в плавающей форме для числового значения или наборе параметров строки для каждого строкового значения. В любом случае эти 5 байт памяти содержат последнее значение, и программа помещает их
_Монитор 16K_
наверх калькуляторного стека, т. е. при выполнении вычислителя выражений калькуляторный стек всегда увеличивается на одно значение.
Второй момент связан с тем, что вычислитель выражений использует значение приоритетов, и операции с более высоким приоритетом должны выполняться раньше операций с низким приоритетом. Операции с равными приоритетами должны выполняться в порядке просмотра. В системе SP значения приоритетов операций, которые ещё будут выполнены, сохраняются в машинном стеке и по частям передаются в калькуляторный стек. В машинном стеке также сохраняются литералы, определяющие какая программа калькулятора будет использоваться для различных операций. Частями вычислителя выражений являются:
24FB-24FE. Сохранение в машинном стеке 0 значения маркера приоритетов. 24FF-2794. Основной цикл вычислителя выражений. Через этот цикл проходит каждый элемент выражения.
2530-2534. Подпрограмма SYNTAZ-Z. Во время проверки синтаксиса флаг нуля должен быть установлен.
2535-257F. Программа SCREENS. 2580-2595. Программа ATTR.
2596-25AE. Таблица функций, не требующих аргументов. 25F8-2626. Программа RND. 2627-2634. Программа PI. 2634-2667. Программа INKEY$.
2756-2758. Используется калькулятор для выполнения специфических операций с одним или двумя операндами.
2795-27 AF. Таблица для преобразования кодов операций в литералы калькулятора. 27В0-27ВС. Таблица приоритетов операций. 27BD-28B1. Программа FN.
28B2-2995. Подпрограмма LOD-VARS. Эта подпрограмма вызывается всякий раз, когда ищется поле переменной. Для специфицированной переменной возвращается адрес текущего значения, если переменная уже использовалась, или устанавливаются соответствующие флаги в противном случае.
2996-2А51. Подпрограмма STK-VARS. Сложная подпрограмма, используемая для поиска простых строковых переменных или переменных массива. Параметры строки или элемента массива возвращаются в калькуляторный стек.
2A52-2AB0. Подпрограмма SLIKING. Любая подстрока может быть выделена из строки, и эта подпрограмма вызывается всякий раз, когда специфицировано выделение.
2AB1-2ACB. Подпрограмма STK-STORE. Очень полезная программа, которая передает параметры текущей строки (регистры A, B, C, D, E) в калькуляторный стек. Стек расширяется на одно значение. В наборе параметров строки регистровая пара BC содержит длину строки, регистровая пара HL - начальный адрес строки и регистр A не используется и содержит нуль. Иногда регистр A содержит единицу и индицирует наличие элементов массива.
2AFF-2BF0. Программа команды LET. Эта команда специально предназначена для команд LET и INPUT.
В случае простой числовой переменной, или старое значение переписывается, или новая переменная добавляется в конец текущего поля переменных. В случае простой строковой переменной любое старое значение будет уничтожено или построена новая переменная в конце поля переменных. И, наконец, в случае переменного массива старое значение всегда переписывается.
2BF1-2C01. Подпрограмма STK-FETCH. Вызов этой подпрограммы приводит к перезаписи верхнего значения калькуляторного стека в регистры A, B, C, D, E. Калькуляторный стек уменьшается на одно значение.
В системе SP подпрограммы STK-STORE и STK-FETCH обычно используются для установки параметров строки, хотя это может быть и 5-байтовое плавающее значение (но использование точки входа 2АВ2 для STK-STORE приведёт к потере пятого байта).
2С02-2С87. Программа команды DIM. Простая программа, которая устанавливает специфицированный массив. Если заданный массив уже существует, то старый массив уничтожается прежде, чем новый добавляется в конец области переменных.
2C88-2F9A. Разнообразные арифметические программы: наиболее важными из них являются:
2D22-2D27. Подпрограмма STK-DIGIT. Цифровой код ASCII (шестнадцатеричное 3039) передаётся в калькуляторный стек в плавающем виде.
2D28-2D2A. Подпрограмма STACK-A. Значение, содержащееся в регистре A, помещается в калькуляторный
стек.
2D2B-2D3A. Подпрограмма STACK-BC. Значение регистровой пары BC передается в калькуляторный стек.
Интересно, что эта подпрограмма используется как программа выхода из функции USR. Следовательно, текущее значение в регистровой паре BC становится последним значением выражения "USR число".
Заметим особо, что регистровая пара IY снова устанавливается на 5C3A, и поэтому всегда выполняется корректный возврат после вызова функции USR. В программах, написанных пользователем, необходимо позаботиться об этом, если регистровая пара IY содержит модифицированное значение и используется STACK-ВС или STACK-A.
2DA2-2DC0. Подпрограмма FP-TO-BC. Верхнее значение калькуляторного стека упаковывается в регистровую пару ВС.
2DD5-2DE2. Подпрограмма FP-TO-A. Верхнее значение упаковывается в регистр A.
2DE3-2F9A. Подпрограмма PRINT-FP. Длинная и очень сложная подпрограмма, которая получает верхнее значение калькуляторного стека, уменьшая его на 1, и печатает требуемое число в целом или плавающем формате. Эта подпрограмма печатает значение любых 5 байтов, независимо от того, являются они или нет действительно числовыми.
При своей работе эта подпрограмма использует специальный буфер печати в 10 адресах МЕМЗ, МЕМ4 (системные переменные 5CA1-5CAA).
2F9B-386D. Подпрограмма калькулятор. Различные части этой подпрограммы будут обсуждены по очереди:
2F9B-300E. Набор различных арифметических подпрограмм.
300F-3013. Литерал 03-вычитание. Первая из 4 основных арифметических программ.
В программе вычитаний: операция выполняется между двумя верхними значениями калькуляторного стека. Самое верхнее значение калькуляторного стека вычитается из следующего, и результатом всегда является одинарное значение на самом верху калькуляторного стека. Поэтому стек уменьшается в размере на 1 значение.
Вычитание рассматривается как сложение C отрицательным слагаемым, т. е. A-B выполняется как A+(-B).
3014-30А8. Литерал 0F-СЛОЖЕНИЕ, два значения наверху калькуляторного стека суммируются и замещаются результатом.
30CA-31AE. Литерал 04-умножение. Два значения наверху калькуляторного стека умножаются.
31AE-3210. Литерал 05-деление. Два значения наверху калькуляторного стека делятся - верхнее значение на значение под ним.
32C5-32D6. Таблица констант для калькулятора. Пять значений могут быть найдены в этой таблице. Значения хранятся в упакованном виде. Это значения 0, 1, 1/2, K/2, 10. Эти константы используются литералами A0-A5 и помещаются наверх калькуляторного стека. Стек увеличивается на одно значение.
32D7-335A. Калькуляторная таблица адресов. Эта таблица содержит адреса 66 программ, которые вызываются использованием калькуляторных литералов. Информация, содержащаяся я таблице, показана ниже.
Литерал |
Адрес |
Название |
Литерал |
Адрес |
Название |
00 |
368F |
JUMP-TRUE |
16 |
353B |
STR-GTR |
01 |
343C |
EXCBANGE |
17 |
359C |
STRS-ADD |
02 |
33A1 |
DELETE |
18 |
35DE |
VAL$ |
03 |
300F |
SUBSTRAON |
19 |
34BC |
USR-S |
04 |
30CA |
MULTIPLY |
1A |
3645 |
READ-IN |
05 |
31AF |
DIVISION |
1B |
346E |
NEGATE |
06 |
3851 |
TO-POWER |
1C |
3669 |
CODE |
07 |
351B |
OR |
1D |
35DE |
VAL |
08 |
3524 |
NO-&-NO |
1E |
3674 |
LEN |
09 |
353B |
NO-L-EQ |
1F |
37B5 |
SIN |
0A |
353B |
NO-GR-EQ |
20 |
37AA |
COS |
0B |
353B |
NOS-NEQL |
21 |
37DA |
TAN |
0C |
353B |
NO-GTR |
22 |
3833 |
ASN |
0D |
353B |
NO-LESS |
23 |
3843 |
ACS |
0E |
353B |
NOS-EQL |
24 |
37E2 |
ATN |
0F |
3014 |
ADDITION |
25 |
3713 |
IN |
10 |
352D |
STR-&-NO |
26 |
36C4 |
EXP |
11 |
353B |
STR-L-EQ |
27 |
36AF |
INT |
12 |
353B |
STR-GR-EQ |
28 |
384A |
SQR |
13 |
353B |
STRS-NEQL |
29 |
3492 |
SGN |
14 |
353B |
STR-GTR |
2A |
346A |
ABS |
15 |
353B |
STR-LESS |
2B |
34 AC |
PEEK |
2C |
34A5 |
IN |
38 |
369B |
END-CALC |
2D |
34B3 |
USR-NO |
39 |
3783 |
GET-ARGT |
2E |
361F |
STRS |
3A |
3214 |
TRUNCATE |
2F |
35C9 |
CHR$ |
3B |
33A2 |
FP-CALC-2 |
30 |
3501 |
NOT |
3C |
2D4F |
E-TO-FP |
31 |
33C0 |
DUPLICATE |
3D |
3297 |
RESTACK |
32 |
36Л0 |
N-MOD-M |
86 |
3449 |
SERIES-06 ETC |
33 |
3686 |
JUMP |
AD |
341B |
CONSTANTS |
34 |
33C6 |
STK-DATA |
C0 |
342D |
ST-MEM-0 ETC |
35 |
367A |
DEC-JR-NZ |
F0 |
340E |
GET-MEM-0 ETC |
36 |
3506 |
LESS-0 |
|
|
|
37 |
34F9 |
GREATER-0 |
|
|
|
3351-33A1. Управляющая программа калькулятора.
33A2-33A8. Литерал 33 - 'FP-CALC-2'. Эта важная программа используется вычислителем выражений при выполнении арифметических операций. Для того, чтобы использовать эту подпрограмму, литерал арифметической операции должен быть помещен в регистр B, прежде чем используется команда RST 0028.
35DE-36ffi. Литерал ID-VAL. В основном подпрограммы в калькуляторе несколько сложны и выходят за рамки этой книги. Однако эту частную программу стоит рассмотреть несколько детально.
Она выполняет:
параметры строки получает из калькуляторного стека;
S в рабочей области отводится достаточное место для строки, включая и символ возврата каретки; S строка копируется в рабочую область и дополняется символом возврата каретки;
¦S бит 7 FLAGS сбрасывается, и вызывается вычислитель выражений;
S далее, если выражение было числовым, флаг синтаксиса будет установлен, и вычислитель выражений вызывается еще раз;
S последнее значение в калькуляторном стеке будет содержать требуемый результат.
36AF-386D. Подпрограммы функций. В системе SP для вычисления функций ЕХР, LN, SIN, ATN используются полиномы Чебышева. Таблицы констант для этих подпрограмм находятся:
36D6-36F6 ЕХР - 8 констант;
3752-377Е LN -12 констант;
37BF-37D0 SIN - 6 констант;
3803-382Е ATN - 2 константы.
Эти константы хранятся в упакованном формате и могут быть распакованы подпрограммой STK-DATA (регистровая пара DE загружается адресом, куда надо поместить результат, регистровая пара HL - основным адресом константы и используется CALL 33C6).
Объясним теперь упакованный вид:
1. Первый байт делится на 40 (16-ное), и экспонента будет равна: S если остаток существует, то остаток - 16-ное +50;
S если остатка нет, то 2-ой байт +50;
2. Частное, которое может быть 0, 1, 2, 3 и показывает, как много ещё байтов будет специфицировано. Во всех случаях число байт будет частное +1. Поскольку мантисса имеет 4 байта, то любые не специфицированные байты зануляются.
Следующие примеры иллюстрируют метод, используемый в SP. 0-упакованная форма 00BC00 - байт 00 делится на 40. Остатка нет, так что экспонента B0+50, которая равна 00, и мантисса 3-й байт 00 и 3 неспецифицированных байта.
1 - упакованная форма 40 B0 00 00, как и выше, экспонента будет 00. Частное 1 и два последующих байта специфицируются 00 00 01 00 00.
/ - упакованный вид 30 00, распакованный вид 80 00 00 00 00.
N/2 - упакованный вид F1 49 0F DA A2, распакованный вид 81 49 0F DA A2.
10 - упакованный вид 40 B0 00 0A, распакованный вид 00 00 0A 00 00.
При использовании; упакованной формы как внешней, любые пять байтов могут быть переданы в калькуляторный стек. Байты в упакованном виде помещаются после литерала 34 - STK-DATA.
Например, чтобы сделать значение 10 последним значением калькуляторного стека надо: RST 0028 использовать калькулятор; 34 использовать STK-DATA;
40 B0 00 0A упакованный вид; 38 использовать END-CALE;
Литерал 3D - RESTACK также стоит рассмотреть. Эта подпрограмма изменяет последнее значение из интегральной формы в плавающую.
Например, для значения 10 00 00 0A 00 00 будет изменено на 84 20 00 00 00.
Эта подпрограмма не оказывает действия на значения, которые уже находятся в плавающей форме.
386E-3CFF. Набор литер (см. стр. 67 для детализации).