Машинные коды 1993 г.

Глава 7 - монитор.


7. МОНИТОР.

7.1 ВВЕДЕНИЕ.

Система SPECTRUM снабжена постоянной памятью, включающей в
себя:

1. Операционную систему.

2. Интерпретатор БЭЙСИК.

3. Знакогенератор 96 литер.

ROM содержит программу монитора, которая занимает адреса 0000-
3FFF (0-16383) и в стандартной системе SPECTRUM не может бьпь
перемещена из этих адресов. Команда, расположенная по адресу 0000h,
является 1 командой, выполняемой после включения питания.

Программа монитора заслуживает изучения по следующим причинам:

1.Подпрограммы монитора всегда доступны для вызова из программ
в машинных кодах, написанных пользователем. Это позволяет
создавать короткие программы.

2. Программа монитора показывает, как фирма решила определенные
проблемы.

3.Программа монитора - это программа в машинных кодах больших
размеров, и поучительно посмотреть, как можно структуироваггь
большую программу.

Разные части монитора теперь будут обсуждены по очереди: сперва
системные аспекты, а затем каждая в отдельности.

7J2 СИСТЕМНЫЙ ВЗГЛЯД НА МОНИТОР.

Пользователь системы обычно не подозревает, что микропроцессор в
центре системы работает по программе в машинных кодах, содержащейся
в ROM, с того момента, когда питание подается к системе. Единственным
исключением из этого бывает выполнение программы в Кодах, написанных
пользователем.

Пользователю SPECTRUM представляется как машина, которая ожидает
программную строку бэйсика либо в непосредственном режиме, либо с
номером для построения бэйсик программы. Строки бэйсик без номера
выполняются немедленно и могут использовать интерпретацию строк из
заранее введенной программы. Система SPECTRUM достаточно совершенна,
поскольку интерпретатор выполняет проверку синтаксиса строки прежде
чем записывает ее в программную область - вне зависимости от того,
выполняется она непосредственно или представляет элемент программы.

■ Операционная система (ОС).

Изучение программы монитора начинается с программы
INITIALIZATION, которая запускается либо после включения питания,
либо по переходу к 0-му адресу (RANDOMIZE USR 0).

■ Инициализация (INITIALIZATION)

Эта программа занимает адреса 0000-0007h и llCB-12Alh. Основными ее
задачами являются проверка наличия памяти и установка системных
переменных. Более подробно это будет рассмотрено позднее. Программа
инициализации заканчивается появлением сообщения SINCLAIR. За этим
стартует программа (MAIN EXECUTION). Эта программа занимает адреса
12А2- ISAEh. В системе SPECTRUM эта программа, как следует из названия,
выполняет основные функции в мониторе.

Эта ггоограмма вызывает (если необходимо) программы LIST EDITOR и
SYNTAX CHECKER, если строка бэйсик добавляется в программную
область. В случае непосредственного выполнения строки, вызывается
программа LINE-RUN, и эта строка интерпретируется - это может включать
в себя интерпретацию других строк бэйсик. Затем, по возвращении из
программы LINE-RUN выдается сообщение. Таблица сообщений об ошибках
находится по адресам 1391-1536h.

■ Редактор (EDITOR).

Программа занимает адреса 0F2C-10A7h. Программа позволяет
пользователю поместить строку бэйсика в нижней части экрана. В
действительности строка формируется в области редактирования и затем
копируется в дисплейную область.

Пользователь может или вводить символы или управлять курсором, и
соответствующие подпрограммы вызываются по мере необходимости.

ENTER вызывает возврат в программу MAIN EXECUTION. В стандартной
системе SPECTRUM войти в программу EDITOR можно единственно через
клавиатуру, и поэтому программа KEYBOARD INPUT вызывает программу
EDITOR. Этот вызов направляется через информационную область канала.

■ KEYBOARD-INPUT.

Программа занимает адреса 10A8-lllCh. Эта программа дает код
последней набранной на клавиатуре клавиши, читая его из системной
переменной LAST-K. Эта программа выполняет и некоторые операции,

например, устанавливает флаги CAPS LOCK и графики.

■ KEYBOARD.

Каждые 1/50 секунды прерываются вычисления, и производится
сканирование клавиатуры. Существует 5 отдельных программ, связанных с
основной программой KEYBOARD, занимающей адреса 02BF-030Fh.
Собственно сканирование клавиатуры выполняет подпрограмма KEY-
SCAN, которая занимает адреса 028E-026Eh. Подпрограмма возвращает
соответствующее ключевое значение в регистровой паре DE, которое
другие программы обслуживания клавиатуры используют для получения
кода литеры.

■ PRINT-OUTPUT.

В добавление к программам, обсужденным выше, имеется много других,
которые также составляют часть ОС. Программа PRINT-OUTPUT
располагается в адресах 09F4-0D4Ch и, возможно, является самой важной
среди других программ. Эта программа в сущности вызывается инструкцией
RST 0010. Адрес, помещенный в 09F4h,. берется из информационной
области канала. RST 0010 определяет быть ли коду, находящемуся в
регистре А, помещенным на TV-ЭКРАН, или быть напечатанным на
принтере. Флаг определяющий это в программе повторно тестируется. «

В системе SPECTRUM программа PRINT-OUTPUT очень мощная,
поскольку и символы и управляющие коды выводятся по этой же программе.

В случае вывода на экран телевизора, текущая позиция печати берется
из соответствующих системных переменных, модифицируется и затем
снова сохраняется. Позиция печати определяет номер строки и колонки и
также соответствующий адрес в экранной области памяти (верхняя левая
точка в поле литеры). Программа PRINT-OUTPUT имеет подпрограмму,
которая по мере необходимости вызывается для вывода символа на экран.
Другие подпрограммы меняют байт атрибутов для той области символов,
чье значение содержится в соответствующих системных переменных.
Заметьте, что стандартные литеры копируются из набора литер, символы
определенные пользователем - из области UDG, в то время как графические
вычисляются по мере необходимости.

Подобная операция приводит к передаче формы символа в буфер
принтера для последующего вывода на принтер; управляющие символы
игнорируются.

В системе SPECTRUM каждый символ, который печатается на TV
экране или принтере, формируется программой PRINT-OUTPUT. Тот
факт, что программа применяется во многих различных случаях, делает
программу довольно медленной, но, несмотря на это, и очень полезной.

■ Интерпретатор бэйсик.

Интерпретатор вызывается как для проверки синтаксиса, так и для
выполнения строки. Эти программы используют для обеих функций флаг
синтаксис/выполнение, чтобы определить какая из операций должна быть
выполнена.

Например, в строке LET А=1 сначала проверяется синтаксис, а затем
переменной А присваивается значение 1. Поэтому в таких случаях может
быть удобно рассматривать синтаксический анализатор как сумму отдельных
функций выполнителя строк, несмотря на то, что реально этого нет.

Интерпретатор состоит нз нескольких частей:

1. Таблица команд располагается в области lA48-lB16h. В системе

SPECTRUM существует 50 команд. Таблица команд содержит классы
команд, символы разделителей и адреса программ выполнения команд.

2. Управляющая программа располагается в адресах lB17-lCEEh и
содержит команды, позволяющие рассматривать операторы бэйсик
один за другим, как требуется в программе. Точкой входа в
синтаксический анализатор является адрес lB17h, а в выполнитель
строки - lBOAh.

3. Программы класса команд располагаются в адресах ICOl-lCDDh
и главным образом занимаются анализом параметров команды
бэйсик. Например, команда NEXT относится к классу 4, как
требующая за собой простую переменную. Команда РОКЕ относится
к классу 8, как требующая за собой два числовых выражения,
разделенных запятой.

4. Большинство программ команд располагаются в адресах 1CDE-
24FAh. Программы команд, связанные с процедурами ввода-вывода,
входят в ОС как часть программы монитора. Программы команд
существуют для каждой из $0 команд бэйсика, выполнение этих
программ и есть собственно работа интерпретатора. Интерпретация
операторов бэйсик может бьпъ проиллюстрирована следующими
примерами. Рассмотрим оператор 10 CLS, интерпретация которого
достаточно проста. Сначала рассматривается команда, не имеющая
операндов, по таблице команд находится адрес (0D6Bh). Программа
команды выполняется, вызывая очистку экрана диегглея и установку
атрибутов байтов. Программа управления затем переходит к
интерпретации следующего оператора. Следующий оператор 20 GOTO
50. В этом случае переменная GOTO программы располагается по
адресу 1Е67И. В этой программе операнд оператора специфицируется
и помещается в системную переменную NEWPPC. Поэтому
управляющая программа расматривает оператор строки 50 как
следующий оператор для интерпретации. В стороке 20 GOTO 50
символы между командой бэйсика GOTO и возвратом каретки
(ENTER) рассматриваются как выражение. В рассматриваемом случае
преобразование выражения просто, так как значение, полученное
преобразованием литер 5 и 0 дает десятичный результат 50. Однако в
SPECTRUMe интерпретатор бэйсика имеет и преобразователь
выражений, который будет рассмотрен ниже.

■ Преобразователь выражений.

Эта программа занимает адреса 24F8-28Blh. В SPECTRUM результат
преобразования выражения может бьпъ или числовой, или строковый.
Числовой результат возвращается как плавающее значение в пяти верхних
байтах калькуляторного стека, в случае строкового результата 5 байтов
представляют собой набор параметров, определяющих строку. Выражение
преобразуется слева направо. Операция, имеющая высший приоритет,
выполняется перед операцией с подобным или низшим приоритетом.
Определенные операции, такие как: FN, RND, PI, INKEY$, BIN, SCREENS,
ATTR, POINT - выполняются без использования преобразователя выражений,
но для всех других он используется. Когда переменная используется в
выражении, преобразователь выражений получает соответствующее значение
для переменной, вызывая программу идентификации этой переменной.

■ Программы переменных.

Этот набор программ занимает адреса 28B2-2ACBh. Эти программы

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

■ Смешанные арифметические программы.

Часть программы монитора, которая занимает адреса 2C88-2F9Ah,
содержит серию арифметических программ. Самый важный из них STACK-
ВС (по адресу 2D2Bh), который перемещает текущее значение, содержащееся
в регистровой парс ВС, в вершину калькуляторного стека; и PRINT-FP (по
адресу 2DE3h), которая берет значение в вершине калькуляторного стека,
преобразует его в десятичную форму и печатает на экране или принтере.

■ Калькулятор.

Это большая и сложная программа, занимающая адреса 2F9B-2FCD.
Обычно выполняется по команде RST 0028, в свою очередь выполняющей
переход по адресу 3358h. По существу калькулятор состоит из 66 подпрограмм,
каждая из которых выполняет различные действия. Вызов этих подпрограмм
осуществляется не по команде CALL, а использованием литералов с 16-ным
значением 00-41 h. Например литерал 04 эквивалентен CALL 30САи приводит
к тому, что два верхних значения калькуляторного стека замещают
одиночным значением, являющимся их произведением. Следовательно, 04
является литералом, обеспечивающим умножение. Эти литералы включаются
в программу как байты данных (DEFB-определение байтов), следующие за
командой RST 0028. Последний DEFB всегда имеет значение 38, которое
выполняет завершающие операции и, таким образом, является возвратом
из калькулятора.

Подпрограмма TAN.

37DA EF RST 0028 - вызов калькулятора Значение х уже в
калькуляторном стеке.

37DB 31 DEFB+31 - дублирование х,х

37DC IF DEFB+1F - SIN х

37DD01 DEFB+01 - обмен SIN х, х

37DE 20 DEFB+20 - COS х

37DF05 DEFB+05 - деление -TAN х

37Е0 38 DEFB+38 - конец

37Е1 С9 RET - возврат к обычным машинным кодам и Верхнее
значение калькуляторного Стека поменялось с х
на TAN х.

Причина применения этой специальной системы использования команды
RST 0028 со следующими за ней литералами состоит в том, что это
сокращает программу в машинных кодах. Пример, приведенный выше
использует только 8 адресов памяти, в то время как использование 5-ти
команд CALL и команд JP потребовало бы в три раза больше адресов.
Вполне возможно использовать калькулятор в программах, написанных
пользователем, но надо беспокоиться о том, чтобы правильно работать с
калькуляторным стеком.

В Набор литер

Существует "неиспользуемая" область 386E-3CFFh, которая предшествует

набору литер, занимающих адреса 3DOC-3FFFh. Набор литер содержит 96
форм символов, каждый из которых использует 64 бита.

3D58 DEFB+00 'О О О О О О О О*

3D59 DEFB+00 *0 О О О О О О О'

3D5A DEFB+08 '0 00 0 100 0'

3D5B DEFB+08 '0 00 0 100 0'

3D5C DEFB+3E 0 0 1 11 1 1 О'

3D5D DEFB+08 '0 00 0 10 0 0'

ЗЕ)5Е DEFB+08 '0000 1000'

3D5F DEFB+00 '00000000'

Выше приведена кодировка символа "плюс".

Программа бэйсика, которая показывает двоичные формы представления:

20 for а-15616 то 16376 step 8

30 for в-0 то 7: let f-peek(a+b): go sub 300: next в

40 print

50 print tab ; chr$(32+(a-15615)/8); "m
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-2"n
330 print chr$(48+int(f/p))
340 let f-f-int(f/p)*p
350 next n
360 print int f
370 return

Строка 60 этой программы позволяет пользователю последовательно
проследить формы всех 90 литер, одна за одной.

7Л РАЗЛИЧНЫЕ ЧАСТИ ПРОГРАММЫ МОНИТОРА.

Программа монитора теперь будет обсуждена секция за секцией в том
порядке, в каком она занимает ROM.
0000-0007h RST 0000.

Первоначальный пуск. Запрещаются маскируемые прерывания,
очищается регистр А, регистровая пара DE загружается значением +FFFF
(верхнее значение адреса RAM), и происходит переход по адресу 11СВ.

0008-000Fh RST 0008.Программа ошибки. Машинный стек очищается

и выдается соответствующее сообщение.

0010-0012 RST ООЮ.Точка входа программы PRINT-A. Осуществляет
переход по aflpecy!5F3h.

0018-0024 RST 0018 ■ RST 0020. Получает текущий символ на который
указывает CH-ADD как на следующий.

0028-0029 RST 0028. Переход по адресу 335Bh, который является
стартовым адресом калькулятора.

0030-0037 RST 0030. Переход по адресу 169£h для выделения места в
рабочей области.

0038-0052. Программа обработки маскируемых прерываний. Часы
реального времени обновляются, и осуществляется сканирование
клавиатуры вызовом по адресу 02BFh.

0066-0070. Программа обработки немаскируемых прерываний, которая
перезапускает систему, если по адресу 5CB0h записан 0.

0095-0204. Таблица ключевых слов. Программа показывает эту таблицу:

10 rem table printer
20 for a-149 to 516
30 let b-peek a

40 if b<28 then print chrs b: goto 60
50 print chr$ (b-128)
60 next a

0205-028D. Таблица клавиш. Существует 6 таблиц, по одной на каждый
из возможных режимов. Наиболее важна первая таблица (0205-022Bh),
которая содержит значения в коде ASCII для больших букв и цифр.

028Б-02ВБ. Программа KEY-SCAN. Значение клавиши возвращается в
регистровую пару DE. Флаг 0 сбрасывается, если одновременно нажато
слишком много клавиш. Обычно регистр Е указывает номер клавиши (00-
27h), а регистр D указывает, какой регистр клавиши был набран.

028F-03B4. Подпрограмма KEYBOARD. Набор подпрограмм, которые
осуществляют возможность повторения и декодируют значения клавиш
для получения требуемого кода литеры. Если клавиша нажата, то ее код
копируете* в системную переменную LIST-K и бит 5 FLAG устанавливается,
чтобы сигнализировать о наличии нового кода.

03B5-03F7. Подпрограмма BEEPER. При выполнении подпрограммы
регистровая пара HL содержит высоту тона требуемой ноты, и регистровая
пара DE содержит ее длительность. Самая низкая высота тона получается,
если число в HL имеет значение +FFFF. Значение длительности должно
быть увеличено также, как и значение высоты тона уменьшено, для того
чтобы иметь одинаковую длительность нот.

03F8-046D. Программа команды ВЕЕР. Эта программа широко использует
калькулятор дли изменения длительности и высоты тона в соответствии со

значением регистровой пары HL и DE. Существует таблица 12 чисел с
плавающей точкой (адреса046E-04A8h) для получения правильных значений
полутонов.

04АА-04С1. По ошибке эти адреса содержат подпрограмму для 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 указывает первый адрес загрузки.
Флаг переноса сброшен для операции верификации и установлен для
операции загрузки или добавления SAVE-BYTES и LOAD-BYTES.
Используется как для работы с заголовком, так и с блоком данных.
0605-075F. Точка входа во все подпрограммы находится по адресу
0605, эта часть имеет дело с конструкцией деталей заголовка в
рабочей области и является общей для всех четырех команд бэйсика
по работе с магнитофоном.

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. Текущая позиция
сохраняется в соответствующих системных переменных. Позиция
печати может указывать на основную часть экрана, нижнюю часть
экрана или буфер принтера.

0В03-0В23. Такая же важная подпрограмма FETCH.
0B24-0BDA. Подпрограмма печати литеры PRINT-ANY. Эта
особенная подпрограмма представляет собой весьма важную часть
программы печати символов в системе SPECTRUM. При выводе
символа в регистровой паре HL содержится начальный адрес места,
где должен быть напечатан символ; в регистровой паре ВС содержится
текущее значение строки и колонки и регистр А содержит код
символа. Начальный адрес формы литеры находится или в наборе

литер, или в области графики определенной пользователем. P-FLAG
также анализируется, чтобы увидеть в каком режиме (OVER или
INVERSE, или оба сразу) должен быть напечатан символ. Затем в
цикле 0ВВ7-0ВС4 форма символа копируется из памяти или в
дисплейную область, или в буфер принтера.
0BDB-0C09. Программа установки атрибутов. После того, как символ
напечатан, байт атрибутов для символов должен быть установлен.
Это включает в себя поиск и формирование значения атрибута и
системных переменных ATTR-T, NASK-T, P-FLAG. Все эти значения
обрабатываются совместно, и результат значения хранится как
новое значение атрибута.

0С0А-0С54. Подпрограмма печати сообщений и ключевых слов.
Входной точкой для печати сообщений является ОСОА, а для печати
ключевых слов - ОС 10. В случае печати сообщений регистровая пара
DE содержит начальный адрес таблицы сообщений (значение должно
быть более чем 7F), а регистр А содержит номер сообщения (начиная
с 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. Операция очистки экрана в
SPECTRUM включает в себя заполнение всех адресов экранной области
нулевым значениеми, а адресов в области атрибутов - специфицированными
значениями. Программа команды использует подпрограмму CL-LINE (0Е44-
0Е67) для очистки 24 строк экранной области. Продвижение экрана
реализуется подпрограммой CL-SCROLL (0Е00-0Е43).

0EAC-0F2B. Программы для принтера.

0BAC-0BCC. Программа команды СОРУ. 196 точечных линий передаются
непосредственно на принтер.

0ECD-0EF0. Подпрограмма COPY-BUFF. Содержимое буфера принтера
передается на принтер.

0EF4-0F2B. Собственно программа принтера.

0F2C-10A7. EDITOR. Программа позволяет пользователю создавать
строку на бэйсике в области памяти редактора. При каждом нажатии
клавиши печатаемый символ или ключевое слово по программе ADD-

CHAR (0F81-0F91) добавляется в редактируемую строку. Адреса 0FAC-0FA8
содержат таблицу для кодов (070Fh) и, для клавиш редактирования секция
0FA9-10А7 содержит различные программы обработки этих клавиш. EDITOR
также вызывается из программы команды INPUT и позволяет пользователю
создавать входные строки в рабочей области.

10А8-111С. KEYBOARD-INPUT. Подпрограмма собирает значения из
LIST-K до тех пор, пока бит 5 FLAGS показывает, что нажата новая
клавиша. Если код "печатаемый", то устанавливается флаг переноса и флаг
0. Установка флага CAPS LOCK обрабатывается в адресах 10DD-10E5, бит
3 FLAGS 2 дополняется каждый раз, когда эта секция выполняется.

Установка режима, использующая клавишу GRAPHICS и регистр CAPS
SHIFT или SIMBOL SHIFT, обрабатывается в адресах 10E9-10F3. Секция
10FA-111C связана с установкой K-DATA, если была нажата цифровая
клавиша.

111D-11B6. Подпрограмма ED-COPY. Редактируемая строка или входная
строка, построенные в редактируемой или рабочих областях этой
подпрограммой, высвечиваются на TV-ЭКРАНЕ.

11В7-11СА. Программа команды NEW. Эта команда выполняет операции
системного рестарта, но оставляет без изменения переменные RAMTOP,
P-RAMT, RASF, PIP, UDG. Она продолжается в INITIALISATION.

11СВ-12А1. Программа INITIALISATION. При входе в регистре А
содержится значение 0 для полного системного рестарта или FF для
генерации NEW.

Основные части программы:
11CC-11CF. TV-ЭКРАН становится белым.

11D0-11D9. Регистр I загружаается значением +3F. Регистр
используется для генерации TV-сигналов.

11DA-11EF. Программа RAM-CHECK. Тестируются адреса, начиная
с 4000 до RAMTOP. Цри выходе регистровая пара HL содержит адрес
последней пригодной для использования ячейки памяти.
11F0-11FF. В случае операции NEW эта секция используется для
перезаписи значений P-RAMT, RASP, PIP, UDG. При системном
рестарте выполнение этой секции бессмысленно.
1200-1218. Эта часть используется при системном рестарте. Графика
пользователя от А до U устанавливается копированием форм из
набора литер в область UDG. Переменные PIP, RASP, P-REMT
инициализируются.

1219-1234. Системная переменная CHARS устанавливается равной
+3000, и организуется машинный стек. Устанавливается режим 1
системы прерываний, регистровая пара IY заполняется 5СЗА, и
разрешаются маскируемые прерывания. С этого момента клавиатура
опрашивается каждые 1/50 секунд.

1235-1243. Начальная информация каналов копируется в область
каналов.

1244-127В. Инициализируется ряд системных переменных. Например,
переменные постоянных характеристик цвета устанавливаются так,
чтобы были черные чернила, белая бумага и белый бордюр.
127С-1285.Начальные данные потока копируются в первые 14 адресов

STRMS. Они представляют потоки от -3 до +3.

1286-12А1. Очищается буфер принтера, очищается экран, и

фирменное сообщение печатается в нижней части экрана

12А2-15АЕ. Программа. MAIN EXECUTION. Различные част этой
программы будут обсуждены далее:

12А2-12Е1. Основной цикл для построения и последовательного ввода
программы бэйсик. Синтаксис каждой строки проверяется, и, если синтаксис
правильный, строка копируется в область программ.

12Е2-1302. Непосредственная строка бэйсика, которая прошла
проверку на сингаксис, интерпретируется. Возврат по адресу 1303
завершает интерпретацию независимо от причин.
1303-1390. Соответствующие сообщения появляются на экране, и
цикл повторяется с адреса 12АС.

1391-1554. Таблица сообщений об ошибках. Фирменное сообщение
находится также в этой таблице.

1555-15АЕ. Заключительная часть программы MAIN EXECUTION.
Используется для копирования строки из области редактирования в
соответствующее место в программной области. При копировании
строки с номером, который уже существует, происходит замещение.
15AF-15C5. Начальная таблица данных канала.
15C6-15D3. Начальная таблица данных потока.
15D4-1651. Программа обслуживания канала. Входом в этот набор
программ является адрес 15D4. Программа ожидает нажатия клавиши
на клавиатуре повторным вызовом подпрограммы KEYBOARD-
INPUT до тех пор, пока установлен флаг переноса. Входы 15EF или
15F2 вызывают печать символа. Выход стандартно осуществляется
через PRINT-OUTPUT. Первая точка входа используется для печати
цифр, вторая - для одинаковых символов и ключевых слов.

1652-1654. Подпрограмма ONE-SPACE.OwH04Hoe место выдается в
области редактирования или рабочей области для строки бэйсика.

1655-1663. Текущее значение регистровой пары ВС показывает, как
много места должно быть выделено, а регистровая пара HL указывает,
после какого места в памяти должна быть выделена эта область.

1664-168Б. Подпрограмма POINTERS. Все указатели от VARS до
STREND при необходимости изменяются.

168F-169D. Подпрограмма номера строки. Для данного адреса начала
строки номер строки размещается в регистровой паре DE.

16DE-16AF. Подпрограмма RESERVE. Требуемый номер области
делается доступен в рабочей области.

16B0-16D8. Набор программ очистки. По коду 16В0 очищается область
строки редактирования, временная рабочая область и калькуляторный
стек. По коду 16D5 очищается только калькуляторный стек.

16DB-16E5. Подпрограмма индексации используется в различных
применениях поиска по таблицам.

16Е5-1792. Программа команд CLOSE и OPEN. Открытие канала
состоит в помещении отличного от 0 значения в соответствующую

переменную STRMS для этого канала. Например: PRINT РЕЕК 23584
содержит нормальный 0, который показывает что канал 5 закрыт. Но после
OPEN #5, "К" PRINT РЕЕК 23584 даст 1 и канал теперь открыт. После
CLOSE #5,"К" PRINT 23584 даст 0. Эти программы проверяют, что каналы
открываются и закрываются правильно.

1793-1794. В стандартном SPECTRUM использование команд CAT,
ERASE, FORMAT, MOVE приводит к выдаче сообщения об ошибке
иневерный поток"

1795-1А47. Программа листинга. Вход 1795 использует MAIN
EXECUTION для выработки автоматического листинга, вход 17F5 для
LLJST и выход 17F9 собственно для LIST.

Различные подпрограммы будут обсуждены:

1855-18В5. Программа печати строки бэйсика. Она вызывается повторно
управляющими программами для печати каждой строки бэйсика. Сначала
печатается номер строки, затем, если требуется, курсор строки.
Окончательно печатаются все символы и ключевые слова. Подпрограмма
18С1-18ВС вызывается в случае необходимости мигающих символов.

190E-197F. Подпрограмма LINE-ADDR. Она используется для поиска
начального адреса строки бэйсика в области программы.

19B8-19D4. Подпрограмма NEXT-ONE предназначена для поиска
следующей строки бэйсика или следующей переменной.

19D5-19FA. Подпрограмма исправления. Любые исправления которые
необходимо произвести, выполняются этой подпрограммой. Сначала
исправляется указатель от VARS до STREND, а затем требуемые данные
добавляются в конец калькуляторного стека.

1А1В. Подпрограмма печати номера. Используется для печати номера
оператора бэйсика или при листинге, или при выводе сообщения.

1А48-1В16. Таблица команд. Существует две таблицы. Первая таблица
ссылок для таблицы параметров. Полная таблица параметров приведена
ниже.

Замечание: Некоторые адреса программ отсутствуют в таблице. Такие
адреса даны в скобках.

1В17-1С00. Управляющая программа интерпретатора бэйсик. В случае
проверки редактируемой строки на ошибку, вход в программу
осуществляется по адресу 1В17 и выполняются следующие шаги:

1. Сбрасывается флаг синтаксиса - бит 7 FLAG S.

2. Любой номер строки проверяется на корректность -используется
подпро1рамма Е-LINE NUMBER по адресу 19FB.

3. Системная переменная, которая считает количество операторов в
строке (SUBPPC) устанавливается в 0.

4. Системная переменная ERR-NR устанавливается в FF. Затем по
огереди (адреса 1В28-1ВЗС) на синтаксис проверяется каждый оператор
строки. В случае отсутствия синтаксических ошибок выход осуществляется
через программу по адресу 1ВВЗ-1ВВ6.

В случае непосредственной интерпретации строки бэйсика входом

служит адрес 1В8А. Флаг синтаксиса - бит 7 FLAG S, должен быть всееда
установлен. Затем операторы строки рассматриваются по очереди. Прямой
возврат выполняется, если нет больше строк бэйсика для интерпретации.
Однако, в том случае, когда непосредственный оператор бэйсика содержит
такие команды, как RUN, GOTO, CONTINUE или соответствующие
RETURN или NEXT, возможна интерпретация других строк бэйсика прежде,
чем возврат будет выполнен после достижения конца программы.

В случае выполнения интерпретации оператора выполняются следующие
действия:

1. Определяется команда бэйсика, и вычисляется адрес в таблице
команд.

2. В таблице параметров определяется первая программа класса команды
и затем выполняется.

3. Выполняются следующие программы класса команд, или подбираются
соответствующие разделители, пока не достигается состояние, при котором
адрес программы команды находится, и программа выполняется.

4. Когда интерпретирован последний оператор в строке, рассматривается
следующая строка.

1С01-1С0С. Таблица класса команд. Эта таблица используется для
поиска основного адреса различных программ класса команд.

1C0D-1CDD. Программа класса команд. Требования, определяемые
различными классами команд, могут быть суммированы так:

класс 00 - нет других операторов;

класс 01 - LET. Требуется переменная;

класс 02 - LET. Выражение числовое или строковое;

класс 03 - числовое выражение, по умолчанию используется 0;

класс 04 - следующей должна бьпъ простая символьная

переменная;
класс 05 - может быть набор элементов;
класс Об - должно следовать числовое выражение;
класс 07 - элементы цвета;

класс 08 - должны следовать два числовых выражения,

разделенные запятой,
класс 09 - как для класса 08, но элементы цвета могут

предшествовать выражениям;
класс 0А - должно следовать строковое выражение;
класс 0В - дрограммы управления магпитафоном.

Программы классов команд довольно сложны и дальше обсуждаться не
будут. Однако адреса 1CAD-1CBD, которые содержат часть программы
класса 07, представляют особый интерес. Эти адреса содержат программы,
которые копируют текущие временные системные переменные в
соответствующие постоянные и которые могут вызываться по мере
надобности.

1CDE-24FA. Программы команд.

Программы этой секции вновь достаточно сложны и не будут детально
обсуждаться. В главе 8, однако, сделаны ссылки на различные программы
печати в том виде, в котором они могут вызываться из программ пользователя.

24FB-28B1. Вычислитель выражений. Наиболее интересная программа
в SPECTRUMe - вычисление функций, не требующих аргументов, которое

выполняется внутри вычислителя выражений, не выделяясь в отдельные
подпрограммы. В результате этого, программист, желающий использовать
эти программы - функции, должен обратиться за помощью к вычислителю
выражений из программы val/vals калькулятора (см. Главу 8 для
детализации).

Существует два основных момента, связанных с вычислителем функций.
Первый из них связан с тем, что программа вычисляет следующее выражение
и формирует одиночный результат. Этот результат занимает 5 байтов
памяти, которые хранят число в форме с плавающей точкой для числового
значения или набор параметров строки для каждого строкового значения.
В любом случае эти 5 байт памяти содержат последнее значение, и
программа помещает их на верх калькуляторного стека. При выполнении
программы вычислителя выражений калькуляторный стек всегда
увеличивается на одно значение.

Второй момент связан с тем, что вычислитель выражений использует
значение приоритетов, и операции с более высоким приоритетом должны
выполняться раньше операций с низшим приоритетом. Операции с равными
приоритетами должны выполняться в порядке просмотра. В системе
SPECTRUM значения приоритетов операций, которые еще будут выполнены,
сохраняются в машинном стеке и по частям передаются в калькуляторный
стек. В машинном стеке также сохраняются литералы, определяющие,
какая программа калькулятора будет использоваться для различных операций.

Частями вычислителя выражений являются:

24FB-24FE. Сохранение в машинном стеке 0 значения маркера
приоритетов.

24FF-2794. Основной цикл вычислителя выражений. Через этот цикл
проходит каждый элемент выражения.

2530-2534. Подпрограмма SYNTAZ-Z. Во время проверки синтаксиса
флаг нуля должен бьггь установлен.

2535-257F. Программа SCREENS.

2580-2595. Программа ATTR

2596-25АЕ. Таблица функций, не требующих аргументов.

25F8-2626. Программа RND.

2627-2634. Программа PI.

2634-2667. Программа INKEYS.

2756-2758. Используется калькулятор для выполнения операций с
одним или двумя операндами.

2795-27AF. Таблица для преобразования кодов операций в литералы
калькулятора.

27В0-27.ВС. Таблица приоритетов операций.

27BD-28B1. Программа FN.

28B2-299F. Подпрограмма LOD-VARS. Эта подпрограмма вызывается
всякий раз, когда ищется поле переменной. Для специфицированной
переменной возвращается адрес текущего значения, если переменная уже

использовалась, или устанавливаются соответствующие флаги в противном
случае.

29А0-2А51. Подпрограмма STK-VARS. Сложная подпрограмма,
используемая для поиска простых строковых переменных или переменных
массива. Параметры строки или элемента массива возвращаются в
калькулягорный стек.

2А52-2АВ0. Подпрограмма SLIKING. Любая подстрока может быть
выделена из строки и, эта подпрограмма вызывается всякий раз, когда
специфицировано выделение.

2АВ1-2АСВ. Подпрограмма STK-STORE. Очень полезная программа,
которая передает параметры текущей строки (регистр A,B,C,D,E) в
калькулягорный стек. Стек расширяется на одно значение. В наборе
параметров строки регистровая пара ВС содержит длину строки, регистровая
пара HL - начальный адрес строки, и регистр А не используется и содержит
нуль. Иногда регистр А содержит единицу и индицирует наличие элементов
массива.

2AFF-2BF0. Программа команды LET. Эта программа специально
предназначена для команд LET и INPUT. В случае простой числовой
переменной или старое значение переписывается, или новая переменная
добавляется в конец текущего поля переменных. В случае простой строковой
переменной любое старое значение будет уничтожено, или построена
новая переменная в конце поля переменных. И, наконец, в случае
переменного массива старое значение всегда переписывается.

2BF1-2C01. Подпрограмма STK-FETCH. Вызов этой подпрограммы
приводит к перезаписи верхнего значения калькуляторного стека в регистры
A,B,C,D,E. Калькулягорный стек уменьшается на одно значение.

В системе SPECTRUM подпрограммы STK-STORE и STK-FETCH обычно
используются для установки параметров строки, хотя это может бьпъ и 5-
байтовое представление числа с плавающей точкой (но использование
точки входа 2АВ2 для STK-STORE приведет к потере пятого байта).

2С02-2С87. Программа команды DIM. Простая программа, которая
устанавливает специфицированный массив. Если заданный массив уже
существует) то старый массив уничтожается прежде, чем новый добавляется
в конец области переменных.

2C88-2F9A. Разнообразные арифметические программы: наиболее
важными из них являются:

2D22-2D27. Подпрограмма STK-DIGIT. Цифровой код ASCII
(шестнадцатиричное 30-39h) передается в калькуляторцый стек в
виде представления с плавающей точкой.

2D28-2D2A. Подпрограмма STACK-A. Значение, содержащееся в
регистре А, помещается в калькулягорный стек.
2D2B-2D3A. Подпрограмма STACK-BC. Значение регистровой пары
ВС передается в калькулягорный стек. Интересно, что эта
подпрограмма используется как программа выхода из функции USR.
Следовательно, текущее значение в регистровой паре ВС становится
последним значением выражения "USR число". Заметим особо, что
регистровая пара ГУ снова устанавливается на 5СЗА. и поэтому всегда
выполняется корректный возврат после вызова функции USR. В

программах, написанных пользователем, необходимо позаботиться
о том случае, когда регистровая пара IY содержит модифицированное
значение, и используется STACK-BC или STACK-A.
2DA2-2DC0. Подпрограмма FP-TO-BC. Верхнее значение
калькуляторного стека упаковывается в регистровую пару ВС.
2DD5-2DE2. Подпрограмма FP-TO-A. Верхнее значение
калькуляторного стека упаковывается в регистр А.
2DE3-2F9A. Подпрограмма PRINT-FP. Длинная и очень сложная
подпрограмма, которая получает верхнее значение калькуляторного
стека, уменьшая его на 1, и печатает требуемое число в целом или
плавающем формате. Эта подпрограмма печатает значение любых 5
байтов независимо от того, являются они или нет действительно
числовыми. При своей работе эта подпрограмма использует
специальный буфер печати размером 10 байт (системные переменные
5СА1-5САА).

2F9B-386D. Подпрограмма калькулятор. Различные части этой
подпрограммы будут обсуждены по очереди:

2F9B-300E. Набор различных арифметических подпрограмм.
300F-3013. Литерал 03-вычитание. Первая из 4 основных
арифметических программ. В программе вычитания операция
выполняется между двумя верхними значениями калькуляторного
стека. Самое верхнее значение калькуляторного стека вычитается из
следующего, и результатом всегда является одинарное значение на
самом верху калькуляторного стека. Вместо двух чисел остается
одно, поэтому стек уменьшается в размере на 1 значение. Вычитание
рассматривается как сложение с отрицательным слагаемым, т.е. А-
В выполняется как А+(-В).

3014-30А8. Литерал OF-сложение. Два значения наверху
калькуляторного стека суммируются и замещаются результатом.
30СА-31АЕ. Литерал 04-умножение. Два значения наверху
калькуляторного стека умножаются.

31АЕ-3210. Литерал 05-деление. Два значения наверху
калькуляторного стека делятся (верхнее значение на значение под
ним),

32C5-32D6. Таблица констант для калькулятора. Пять значений
могут бьпъ найдены в этой таблице. Значения хранятся в упакованном
виде. Это значения 0, 1, 1/2, PI/2, 10. Эти константы используются
литералами А0-А5 и помещаются на верх калькуляторного стека.
Стек увеличивается на одно значение.

32D7-335A. Калькуляторная таблица адресов. Эта таблица содержит
адреса 66 программ, которые вызываются использованием
калькуляторыых литералов. Информация, содержащаяся в таблице,
показана ниже.

3351-33A1. Управляющая программа калькулятора.

ЗЗА2-ЗЗА8. Литерал ЗВ FP-CALC-2. Эта важная программа используется
вычислителем выражений при выполнении арифметических операций. Для
того, чтобы использовать эту подпрограмму, литерал арифметической
операции должен бьпъ помещен в регистр В, прежде чем используется
команда RST 0028.

35DE-361E. Литерал ID-VAL. В основном подпрограммы в калькуляторе
достаточно сложны и выходят за рамки этой книги. Однако, эту частную
программу стоит рассмотреть детально.

Она выполняет следующие действия:

- параметры строки считываются из калькуляторного стека;

- в рабочей области отводится достаточное место для строю!,
включая и символ возврата каретки;

- строка копируется в рабочую область и дополняется символом
возврат каретки;

- бит 7 FLAGS сбрасывается и вызывается вычислитель
выражений;

- далее,если выражение было числовым, флаг синтаксиса
будет установлен, и вычислитель выражений вызывается еще
раз;

- последнее значение в калькуляторном стеке будет содержать
требуемый результат.

36AF-386D. Подпрограмы функций. В системе SPECTRUM для

вычисленияфункций EXP, LN, SIN, ATN используются полиномы Чебышеба.
Таблицы констант для этих .подпрограмм находятся:
36D6-36F6 - ЕХР-8 констант
3752-377Е - LN-12 констант
37BF-37D0 - SIN-6 констант
3803-382Е - ATN-2 константы.

Эти константы хранятся в упакованом формате и могут быть распакованы
подпрограммой STK-DATA (регистровая пара DE загружается адресом,
куда надо поместить результат: решстоовая пара HL - основным адресом
константы, и используется CALL ЗЗСо).
Объясним теперь способ распаковки:

1. Первый байт делится на 40h и экспонента будет:

- если остаток существует, то остаток +50h;

- если остатка нет, то второй байт +50h.

2. Частное, которое может быть 0,1,2,3 показывает, как много еще
байтов будет специфицировано. Во всех случаях общее число байт мантиссы
будет равно: частное плюс один. Поскольку мантиса имеет 4 байта, то
любые неспецифицированные байты зануляются. ______

Следующие примеры иллюстрируют метод, используемый в SPECTRUM.

0- упакованная форма 00 ВО 00. Байт 00 делится на 40. Остатка нет,
так что экспонента равна В0+50 = 00. Мантиса 00 и три
неспецифицированных байга.

распакованная форма 00 00 00 00 00

1-упакованная форма 40 ВО 00 00 , как и выше, экспонента будет 00.
Частное 1 и два последующих байга специфицируются 00 00 0100 00
1/2-упакованный вид 30 00, распакованный ввд 80 00 00 00 00
Р1/2тупакованный вид F149 OF DA А2, распакованный вид 81 49 0F
DAA2

10 -упакованный вид 40 ВО 00 0А, распакованный вид 00 00 0А 00 00
При использовании упакованной формы любые пять байтов могут быть
переданы в калькуляторный стек. Байты в упакованом виде помещаются
после литерала 34-STK-DATA.

Например, чтобы сделать значение 10 последним значением
калькуляторного стека надо:

RST 0028 использовать калькулятор
34 использовать STK-DATA
40 ВО 00 0А упакованный вид
38 использовать END-CALE

Литерал 3D - RESTACK также стоит рассмотреть. Эта подпрограмма
изменяет последнее значение из целочисленной формы в форму с плавающей
точкой.

Например, для значения 10:

00 00 0А 00 00 будет изменено на 84 20 00 00 00

Эта подпрограмма не оказывает действия на значения, которые уже
находятся в плавающей форме.

386E-3CFF. Набор литер.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Реклама - реклама и объявления.
Конструктор - монументальная статья по универсальному контроллеру периферии SMUC.
Юмор - Часы командирские с зубонепpокусаемым pемешком и смеpтным боем...
Почётные и Вечные - Список Заслуженных Пользователей AC Edit.
Список BBS - Список ныне действующих BBS в городе С.-Петербурге.

В этот день...   21 ноября