ZX-FORTH
1. ОСНОВЫ РАБОТЫ.
Простейший способ освоения ФОРТа состоит в том, чтобы начать
его применять. Поскольку ФОРТ - язык интерактивный, то Вы можете с
ним экспериментировать. В этом руководстве приведено немало примеров
по применению ФОРТа, демонстрирующих его возможности. Мы
предполагаем, что Вы поработаете и с ними.
УКАЗАНИЯ ПО ЗАГРУЗКЕ КОМПИЛЯТОРА И РЕДАКТОРА.
Сначала загрузите компилятор LOAD "" CODE. Остановите ленту
после окончания загрузки.
Теперь надо загрузить редактор. Для этого наберите:
1 LOAD<ENTER>.
Компилятор ответит сообщением READY CASSETTE. Нажатие ENTER
инициализирует процедуру загрузки с кассеты. Запустите ленту и
нажмите ENTER. Первый экран загрузится через несколько секунд.
Остановите магнитофон, когда закончатся характерные желто-голубые
полосы. Подождите сообщения READY CASSETTE и затем снова включите
магнитофон и нажмите ENTER. Всего должны быть загружены три экрана.
Если загрузка прошла ненормально, то перемотайте ленту на начало и
повторите. После загрузки третьего экрана должно появиться
сообщение "O.K.".
Не пугайтесь, если появится сообщение об ошибке MSG #4!
Теперь редактор загружен и Вы можете начать программирование на
ФОРТе.
НАЧАЛО РАБОТЫ
ФОРТ объявит о готовности к работе и сообщит Вам какой объем
свободной памяти Вы имеете. Когда система будет готова к вводу с
клавиатуры, на экране появится курсор. Вы можете теперь набирать
команды, завершая строку клавишей ENTER. Пока ENTER не нажата, Вы
можете свободно изменять свои команды с помощью DELETE, стирая
ненужные символы и набирая то, что Вам надо.
Простейшая команда, которую Вы можете дать - это "пустая
строка". Если Вы просто нажмете ENTER, то на экране появится
сообщение "O.K.", т.к. ФОРТ поймет, что ему ничего не надо делать и
будет ждать другой команды. Попробуйте это сделать, чтобы убедиться,
что ФОРТ работает и внимательно ждет Ваших команд.
ЭКРАННЫЙ РЕДАКТОР
ФОРТ для СПЕКТРУМА имеет экранный редактор, который позволяет
переделывать слова, в которых Вы допустили ошибку.
Редактор имеет дополнительный курсор, который перемещается с
помощью курсорных клавиш. Вызывается редактор нажатием на одну из
этих клавиш. Установите курсор на строку, которую Вы хотите
переделать и нажмите EDIT. Символ, находившийся на месте курсора
редактора, будет скопирован в позицию курсора ФОРТа. Поскольку
действие клавиш имеет автоповтор, то задержка нажатия EDIT позволяет
скопировать целую строку.
ТАБЛИЦА 1
КОМАНДЫ РЕДАКТОРА
ТАБЛИЦА 1
КОМАНДЫ РЕДАКТОРА
КОМАНДА |
ДЕЙСТВИЕ |
CAPS SHIFT |
5 |
Курсор влево. |
CAPS SHIFT |
6 |
Курсор вниз. |
CAPS SHIFT |
7 |
Курсор вверх. |
CAPS SHIFT |
8 |
Курсор вправо. |
CAPS SHIFT |
1 |
Скопировать символ и переместить курсор |
|
|
на одну позицию к следующему символу. |
СЛОВА
Основной структурной единицей команд ФОРТа является СЛОВО.
Слово - это символьный стринг, ограниченный с обеих сторон
пробелами. Единственное ограничение, которое накладывается на СЛОВА
- это то, что СЛОВО не может содержать внутри себя пробела, кода
"ENTER" или графического символа. СЛОВО может быть любой длины, при
этом первые 31 символ являются значащими. СЛОВА можно вводить как в
верхнем, так и в нижнем регистрах.
После окончания ввода строки текста по коду ENTER интерпретатор
ФОРТа просматривает ввод и разделяет его на слова, которые далее
будут исполняться в порядке их ввода. Каждое слово имеет ИМЯ
(показывает, как к нему обратиться) и ОПРЕДЕЛЕНИЕ (показывает что
оно делает).
Для того, чтобы выполнить слово, интерпретатор вызывает
словарь, в котором находит определение слова. Если слово найдено, то
его определение интерпретируется, а если нет, то интерпретатор
пытается конвертировать его в 16-разрядное целое число. Если это
слово не представляет полноценного числа, то появляется сообщение об
ошибке #0. Система возвращается к очередному вводу. Словарь может
быть расширен путем включения в него новых слов, которые
определяются через уже существующие (см. раздел 1.7).
ЧИСЛА
Числа могут быть записаны в различных системах счисления по
основанию от 2 до 36. По умолчанию в момент включения принимается
десятиричная система. Тем не менее, с помощью команд DECIMAL или HEX
Вы можете переключаться, а можете и задать свою систему.
Установленное основание системы счисления распространяется на все
последующие операции, связанные с вводом или выводом. Вообще говоря,
лучше придерживаться одного основания при всех определениях, чтобы
избежать конфликтных ситуаций при интерпретации.
Числа могут быть напечатаны как положительные или отрицательные
целые. Разрешены положительные целые (без знака) от 0 до 65535, а
также целые со знаком от -32768 до 32767. Вы можете также
использовать целые числа двойной точности как целые со знаком от
-2147483648 до 2147483647. Перед такими 32-разрядными целыми числами
двойной точности должна стоять точка '.'.
Поскольку все числа хранятся в двоичной форме, Вы можете
использовать преимущество свободного выбора системы счисления для
выполнения преобразований десятичных чисел в шестнадцатиричные и
наоборот. Например, наберите:
DECIMAL 258 HEX .<ENTER>!
- и Вы получите ответ 102 O.K. (но помните, что после этого Вы
будете находиться в шестнадцатиричной системе счисления.
СТЕК ПАРАМЕТРОВ
Все программы работают с данными, используя установленный набор
параметров. В ФОРТЕ большинство параметров содержатся в стеке,
называемом стеком параметром.
Стек - это специальная структура организации памяти. Слова
ФОРТа, обращающиеся к стеку параметров, имеют доступ только к
значению, находящемуся на вершине стека. Принцип "LIFO- last in
first out" (ПОСЛЕДНИМ ПРИШЕЛ - ПЕРВЫМ УЙДЕШЬ). Чтобы поместить
параметр на стек, Вы должны набрать его как часть команды ввода.
Слово ФОРТА '.' (точка) выполняет снятие числа с вершины стека и
печать его на экране в текущей установленной системе счисления.
Например, для того, чтобы поместить числа на стек, наберите:
2 4 6 8 <ENTER>
Теперь стек выглядит так: 8
6
4
2
Если Вы теперь наберете .<ENTER>, то получите 8 O.K.
Стек теперь содержит: 6
4
2
Наберите: ...<ENTER> и получите: 6 4 2 O.K. Стек пуст.
Предположим, что Вы наберете .<ENTER> и компьютер ответит
сообщением об ошибке .?MSG#1 (потеря порядка на стеке).
ФОРТ имеет еще один стек, который называется стеком возврата и
используется интерпретатором для запоминания адреса возврата. Любые
сообщения об ошибках опустошают оба стека.
АРИФМЕТИКА
ФОРТ имеет предварительно заданный набор арифметических
операторов (см. табл. 2). Поскольку он применяет стековую
организацию памяти и обратную польскую нотацию в качестве формы
записи выражений, то прежде чем операция будет выполнена, параметр
должен быть помещен на стек. Так, для того, чтобы сложить два числа,
наберите:
5 27 + . <ENTER> и получите: 32 O.K.
Разберем эту строку.
5 - на стек помещается число 5.
27 - на стек помещается число 27.
+ - два верхних параметра снимаются с вершины стека,
суммируются между собой и результат вновь помещается на
стек.
. - верхний параметра снимается со стека и распечатывается на
экране.
Тем самым стек в результате этих манипуляций остался совершенно
без изменений.
Процесс сравнения также может Вам показаться незнакомым. ФОРТ
работает по соглашениям позитивной логики.
О . FALSE
#0 . TRUE
Для работы слов, выражающих сравнение, таких как <, >, = и
т.п., нужно помнить, что они употребляются так, как если вершина
стека записана слева от этого слова, а второй по очереди параметр
справа. Так, запись А В < означает: "Выполнить сравнение А>В и
оставить на стеке только значение ИСТИНЫ, поскольку оба числа будут
удалены со стека.
РАБОТА СО СТЕКОМ
Другой класс часто встречающихся операций - это операции над
стеком. Для таких операций ФОРТ имеет несколько простых слов (см.
табл. 4). Обычно они применяются для наведения порядка на стеке во
время работы. Попрактиковавшись с ними, Вы быстро научитесь
эффективно их использовать.
Практикуясь, держите в уме два элементарных правила:
1. Следите за четностью - все, что помещено на стек, должно
оттуда уйти.
2. Никогда на снимайте со стека больше, чем Вы туда
поместили.
После того, как Вы освоитесь с арифметическими операциями и с
операциями со стеком, попробуйте создавать свои собственные слова.
Например, для возведения в квадрат:
:SQUARE DUP * . ; <ENTER> O.K.
ОПРЕДЕЛЕНИЯ
Часть больших возможностей ФОРТа лежит в его способности
создавать новые слова. Например, Вам может быть необходимо часто
рассчитывать куб какого-либо числа. Можно определить слово для
выполнения этой работы.
: CUBE DUP DUP * * . ; <ENTER> O.K.
Вот что делают компоненты этой записи:
: - начало определения.
CUBE - имя, которое должно быть добавлено к словарю.
DUP DUP * * - слова ФОРТА, которые указывают что надо
делать.
; - завершение определения.
После того как определение выполнено, можно рассчитать и
распечатывать кубы чисел всякий раз, когда это необходимо. Например:
4 CUBE <ENTER> 64 O.K.
3 CUBE <ENTER> 27 O.K.
Что произойдет, если Вы используете слово CUBE до того, как оно
будет задано? ФОРТ этого не допустит. Будет распечатано сообщение об
ошибке CUBE? MSG#0 (слово не определено). К счастью, для начинающего
программиста ФОРТ имеет богатый словарь предварительно определенных
слов.
Например: ? - печать содержимого ячейки памяти на которую
указывает вершина стека. "?" имеет простое определение:
: ? @ . ;
Другая простая уже определенная комбинация - это 1+ . Она
добавляет единицу к тому, что содержится на вершине стека и имеет
следующее определение.
: 1+ 1 + ;
РЕЖИМЫ
Интерпретатор ФОРТА работает в двух режимах - непосредственного
исполнения и компиляции. В режиме непосредственного исполнения
каждое слово вводимого стринга просматривается по словарю и
исполняется немедленно. В режиме компиляции большинство слов не
исполняется. Вместо этого компилируется ссылка на их место в
словаре. Слово ":" (двоеточие) переводит в режим компиляции, а слово
возвращает в режим непосредственного исполнения.
Откомпилированная форма определений состоит из указателей,
которые указывают на адрес подпрограммы, рассчитывающей значение
определения. К нему обращается внутренний интерпретатор. Такая форма
интерпретации работает чрезвычайно быстро. Чтобы почувствовать
разницу между этими режимами, попробуйте следующие примеры:
905 . <ENTER> 905 O.K.
Исполнение немедленное.
: SHOW 905 . ; <ENTER> O.K.
Компиляция прошла, но ничего не происходит.
SHOW <ENTER> 905 O.K.
Исполняется откомпилированная процедура и на экране появляется
искомый результат.
Мы рекомендуем Вам обязательно попрактиковаться в использовании
базовых слов ФОРТА.
ТАБЛИЦА 2
АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
ТАБЛИЦА 2
АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ
СЛОВО |
ОПИСАНИЕ |
ПРИМЕР |
СОСТОЯНИЯ |
СТЕКА |
16 БИТ |
|
|
до |
|
ПОСЛЕ |
+ |
Сложение |
|
9 |
6 |
2 |
|
9 |
8 |
- |
Вычитание |
|
9 |
6 |
2 |
|
9 |
4 |
* |
Умножение |
|
9 |
6 |
2 |
|
9 |
12 |
/ |
Деление |
|
9 |
6 |
2 |
|
9 |
3 |
1 + |
Прибавить 1 |
|
9 |
6 |
2 |
9 |
6 |
3 |
2 + |
Прибавить 2 |
|
9 |
6 |
2 |
9 |
6 |
4 |
ABS |
Дать абсолютную |
величину |
9 |
-6 |
-2 |
9 |
-6 |
2 |
МАХ |
Дать наибольшее |
число из двух |
|
|
|
|
|
|
|
верхних |
|
9 |
6 |
2 |
|
9 |
6 |
MIN |
Дать наименьшее |
число из двух |
|
|
|
|
|
|
|
верхних |
|
9 |
6 |
2 |
|
9 |
2 |
MINUS |
Смена знака |
|
9 |
6 |
2 |
9 |
6 |
-2 |
MOD |
Остаток от деления |
9 |
6 |
2 |
|
9 |
0 |
*/ |
Перемножить 2-е |
и 3-е и |
|
|
|
|
|
|
|
разделить на первое число |
9 |
6 |
2 |
|
|
27 |
+ - |
Присвоить 2-му знак 1-го |
9 |
6 |
-2 |
|
9 |
-6 |
/MOD |
Разделить 2-е на |
. 1-е и дать |
|
|
|
|
|
|
|
остаток и частное |
9 |
6 |
2 |
9 |
0 |
3 |
AND |
Логическое "И" |
|
9 |
6 |
3 |
|
9 |
2 |
OR |
Логическое "ИЛИ" |
|
9 |
6 |
3 |
|
9 |
7 |
XOR |
Логическое исключающее "ИЛИ" |
9 |
6 |
3 |
|
9 |
5 |
Существуют также операторы для чисел двойной точности и
составные операторы (см. разд. "СЛОВАРЬ").
ТАБЛИЦА 3
ОПЕРАТОРЫ СРАВНЕНИЯ
ТАБЛИЦА 3
ОПЕРАТОРЫ СРАВНЕНИЯ
СЛОВО |
ОПИСАНИЕ |
ПРИМЕР |
СОСТОЯНИЯ |
СТЕКА |
|
|
ДО |
|
ПОСЛЕ |
< |
Сравнение. Дает 1, если 2-е |
|
|
|
|
|
|
меньше 1-го, иначе 0 |
9 |
6 |
2 |
|
9 0 |
> |
Сравнение. Дает 1, если 2-е |
|
|
|
|
|
|
больше 1-го, иначе 0 |
9 |
6 |
2 |
|
9 1 |
0 = |
Проверка на 0. Дает 1, если |
|
|
|
|
|
|
верхнее число меньше 0,иначе 0 |
9 |
6 |
2 |
9 |
6 0 |
0> |
Проверка на отрицательность. Дает 1, если вершина стека |
|
|
|
|
|
|
меньше 0, иначе 0 |
9 |
6 |
2 |
9 |
6 0 |
= |
Проверка чисел на равенство. Дает 1, если два верхних |
|
|
|
|
|
|
числа равны, иначе 0 |
9 |
6 |
2 |
9 |
6 0 |
ТАБЛИЦА 4
ОПЕРАТОРЫ УПРАВЛЕНИЯ СТЕКОМ
ТАБЛИЦА 4
ОПЕРАТОРЫ УПРАВЛЕНИЯ СТЕКОМ
СЛОВО |
ОПИСАНИЕ |
ПРИМЕР |
СОСТОЯНИЯ |
СТЕКА |
|
|
|
ДО |
|
|
|
ПОСЛЕ |
|
|
Печать вершины стека |
1 |
2 |
3 |
|
|
|
1 |
2 |
DROP |
Отбросить верхнее значение |
3 |
2 |
1 |
|
|
|
3 |
2 |
DUP |
Повторить верхнее значение |
3 |
2 |
1 |
|
3 |
2 |
1 |
1 |
-DUP |
Повторить верхнее значение, |
3 |
2 |
1 |
|
3 |
2 |
1 |
1 |
|
если оно не 0 |
3 |
2 |
0 |
|
|
3 |
2 |
0 |
OVER |
Копировать 2-е число выше 1-го |
3 |
2 |
1 |
|
3 |
2 |
1 |
2 |
ROT |
Ротация 3-х верхних значений |
3 |
2 |
1 |
|
|
2 |
1 |
3 |
SWAP |
Поменять местами два верхних |
|
|
|
|
|
|
|
|
|
значения |
3 |
2 |
1 |
|
|
3 |
1 |
2 |
.R |
Печать 2-го числа в поле первого с выравниванием справа |
3 |
2 |
1 |
|
|
|
|
3 |
R |
Копирование вершины стека возврата в стек компиляции |
20 |
30 |
20 |
30 |
|
|
|
|
|
|
1 |
2 |
3 |
|
1 |
2 |
3 |
30 |
2. ОБЪЯВЛЕНИЕ ДАННЫХ.
2. ОБЪЯВЛЕНИЕ ДАННЫХ.
ФОРТ позволяет Вам выделять часть памяти для постоянных,
переменных и массивов.
ПОСТОЯННЫЕ
Чтобы присвоить имя постоянной служит слово CONSTANT.
Например: 5280 CONSTANT FT/MILE <ENTER> O.K. создает новое слово
FT/MILE и присваивает ему значение 5280. После того как это новое
слово определено, Вы можете использовать его так, как Вы
использовали бы число 5280, поместив его на стек. Например»
3FT/MILE * рассчитает количество футов в трех милях. После того как
значение было определено в качестве постоянной, его величина в
двоичной форме уже не зависит от принятого основания системы
счисления.
ПЕРЕМЕННЫЕ
Слово VARIABLE служит для присвоения имени ячейке, в которой
возможно изменение содержания. Если, предположим, Вы хотите там
хранить счет игры SPACE INVADERS, то Вы должны объявить переменную
следующим образом:
0 VARIABLE SCORE <ENTER> O.K.
Здесь первый 0 - это начальное значение переменной. Когда Вы
обращаетесь к переменной по имени, ее адрес помещается на стек.
Слово ФОРТа '@' заменяет адрес, находящийся на стеке, содержимым
двух байтов, расположенных по этому адресу. Например, чтобы
поместить счет игры на стек, Вы можете использовать:
SCORE @ <ENTER> O.K.
Слово '!'служит для помещения по адресу 16-битного значения.
•!' берет значение, находящееся во 2-й позиции стека и запоминает
его в адресе, находящемся на стеке. Например, чтобы установить счет
равным 100, надо:
100 SCORE ! <ENTER> O.K.
Слово '+!' служит для увеличения значения переменной.
Например, увеличить счет на 100:
100 SCORE +! <ENTER>
Примечание: поскольку позиции стека служат для хранения
промежуточных значений, нужда во временных переменных отпадает.
ИЗМЕНЕНИЕ ОСНОВАНИЯ СИСТЕМЫ СЧИСЛЕНИЯ
ФОРТ имеет переменную пользователя, в которой хранится текущее
значение основания действующей системы счисления. Вы можете
присвоить этой переменной любое значение от 2 до 36, чтобы задать
основание системы счисления, отличной от десятичной или
шестнадцатиричной. Если Вы хотите работать в двоичной системе, Вы
можете это сделать так:
2 BASE ! <ENTER> O.K.
После этого все последующие числа будут печататься в двоичной
форме.
Помните, что и ввод тоже должен выполняться в двоичной системе
счисления.
МАССИВЫ
Массивы данных имеют важное значение во многих случаях.
Например, вместо того, чтобы иметь 10 переменных ТО, Т1, Т2,... и
т.д., удобнее иметь 10 последовательных элементов TEMP. Применением
необходимой арифметики для расчета адреса, Вы можете рассчитать
адрес нужного Вам элемента. Это дает большую гибкость программам, а
также способствует экономичному использованию пространства словаря.
Для того, чтобы выделить в словаре место для массивов,
используется слово 'ALLOT'. Например:
0 VARIABLE TEMP 18 ALLOT <ENTER> OK
Здесь:
0 VARIABLE TEMP - определяет двухбайтную переменную по
имени TEMP.
18 - помещение числа 18 на стек.
ALLOT - назначение последующих 18 байтов для TEMP.
Для того, чтобы обратиться к N-ному элементу массива, поместите
N на вершину стека и далее следуйте так:
2 * TEMP + @ <ENTER> OK
Элементы массива нумеруются 0...9, а не 1...10 !
Значения N, выходящие за пределы диапазона, могут приводить к
непредсказуемым результатам. Для того, чтобы инициализировать N-ный
элемент, наберите:
(value) п 2 * TEMP +! <ENTER> OK
ДРУГИЕ ОПЕРАЦИИ С ПАМЯТЬЮ
Имеются 4 слова, которые позволяют оперировать с ячейками
памяти.
1. CMOVE. Переместить заданное количество байтов (первый
параметр на стеке), начиная с адреса (третий параметр на стеке) в
адрес (второй параметр стека). При этом содержимое самого нижнего
адреса идет первым.
Пример: 16396 8000 64 CMOVE <ENTER> OK
Теоретически здесь перемещаются 64 байта из адреса 16396 в
адрес 8000.
2. FILL. Заполнить память, начиная с адреса (третий параметр на
стеке) в количестве (2-й параметр) байтов значением (1-й параметр).
Пример: 8000 64 0 FILL <ENTER> OK
Начиная с адреса 8000 помещается значение 0 в 64 байта.
3. ERASE. Заполнить блок памяти нулями, что эквивалентно 0
FILL.
Пример: 8000 64 ERASE <ENTER> OK
Стираются 64 байта, начиная с 8000.
4. BLANKS. Заполнить блок памяти пробелами.
(=32 FILL) (ASCII) (см. гл.3)
Пример: 8000 64 BLANKS <ENTER> OK
Начиная с адреса 8000 и выше помещаются 64 байта, равных 32.
ТАБЛИЦА 5
ОПЕРАЦИИ С ПАМЯТЬЮ
ТАБЛИЦА 5
ОПЕРАЦИИ С ПАМЯТЬЮ
СЛОВО |
ОПИСАНИЕ |
ПРИМЕР СОСТОЯНИЯ СТЕКА |
|
|
ДО |
ПОСЛЕ |
@ |
Поместить содержимое ячейки, адрес которой находится на |
|
|
|
вершине стека |
100 |
-236 |
J |
Поместить второй параметр стека в |
|
|
|
ячейку, адрес которой находится |
|
|
|
на вершине стека |
3 20000 |
пустой |
9 |
Взять на стек и распечатать зна- |
|
|
|
чение из адреса на вершине стека |
100 |
пустой |
+ ! |
Увеличить значение, хранящееся по адресу на вершине стека на величи- |
|
|
Продолжение ТАБЛИЦЫ 5
Продолжение ТАБЛИЦЫ 5
|
ну второго параметра стека |
701 2000 |
пустой |
С@ |
Взять байт по адресу, находящему- |
|
|
|
ся на вершине стека |
100 |
20 |
С! |
Записать байт (2-й) по адресу, |
|
|
|
находящемуся на вершине стека |
254 2000 |
пустой |
Операции с двойной точностью см. в словаре.
Операции с двойной точностью см. в словаре.
3. ВВОД и вывод.
Для того, чтобы выполнить какие-либо действия на компьютере,
надо ввести данные в компьютер и вывести результат. ФОРТ обладает
для этого разнообразными возможностями.
НАБОР СИМВОЛОВ
С помощью слова 'DEF' могут быть заданы символы графики
пользователя (коды 144 - 164). Чтобы задать символ, поместите на
вершину стека 8 байтов, представляющих двоичную матрицу символа,
начиная с нижнего ряда изображения и до верхнего, затем поместите
код символа, который Вы хотите изобразить, а затем слово DEF. Может
быть это и выглядит сложно, но вот как задается символическое
изображение фигуры человека:
HEX <ENTER>
81 81 66 ЗС FF 7Е 18 18 <ENTER>
DECIMAL <ENTER>
144 DEF <ENTER> OK
Теперь символ 144 соответствует фигурке человечка.
ВВОД ИНФОРМАЦИИ
По существу ФОРТ не имеет команд для ввода, поскольку числа,
представляющие параметры для всех исполняемых команд, должны
находиться на стеке. Они обычно помещаются на стек перед исполнением
команды. Предположим, что Вы хотите рассчитать выражение:
(4Х -ЗХ+2)
для любого значения X. Тогда надо просто определить команду для
расчета куба числа и команду для расчета всего выражения. Например:
: CUBE DUP DUP * * ;
: CUBIC DUP CUBE 4 * SWAP 3* - 2 + . ; <ENTER> OK
Теперь значение X, необходимое для расчета, просто помещается
на стек до выполнения команды CUBIC:
8 CUBIC <ENTER> 2026 OK
Так любой параметр может быть передан в команду и никакого
ввода не требуется.
Тем не менее, ФОРТ имеет команду для определения нажатия
клавиши на клавиатуре. Ей соответствует слов 'KEY'. Она похожа на
команду БЕЙСИКа INKEY$. Отличие состоит в том, что 'KEY' ждет, когда
клавиша будет нажата, a INKEY$ - нет.
Предположим, что во время * исполнения программы Вам
потребовалось сделать какой-либо ввод. Например:
'Вам нужны инструкции Y или N?'
Команда 'KEY' помещает значение кода нажатой клавиши (в кодах
ASCII) на вершину стека, где оно может быть проанализировано. В
ФОРТе нет стандартной процедуры для ввода числа из более чем одной
цифры с клавиатуры. Тем не менее, в Приложении мы приводим процедуру
для ввода чисел под названием 'INPUT'. Попробуйте написать такую
процедуру сами.
ВЫВОД И ПЕЧАТЬ
ФОРТ предоставляет несколько различных способов для вывода
информации. Наиболее широко используется вывод строки текста. Для
этого ФОРТ имеет слово '." ' за которым следует сам текст,
заканчивающийся знаком ' " '. Например:
."Это текстовая строка" <ENTER>
По этой команде на экране будет напечатано заключенное в
кавычки сообщение. Какой-либо последующий вывод появится на этой же
строке. ФОРТ имеет также слово 'CR' (возврат каретки), что
эквивалентно ENTER и после него вывод начинается с новой строки.
Слово 'AT' эквивалентно своему аналогу из БЕЙСИКа и служит для
установки позиции, в которой должна производиться печать. Так, чтобы
напечатать сообщение в 3-й строке, 2-й колонке:
3 2 AT " HELLO "
На "Спектруме" ФОРТ автоматически выполняет скроллинг экрана,
когда текущая позиция печати доходит до самого низа.
Еще один способ печати символа состоит в использовании слова
'EMIT', которое печатает символ, код которого находится на вершине
стека. Он мог быть помещен туда, например, командой 'KEY'. Этот
прием позволяет Вам также распечатать символ, который не может быть
получен с клавиатуры напрямую. Например, '143 EMIT <ENTER>'
напечатает символ "графический пробел" (код номер 143). Вывод может
быть отправлен и на принтер.
В ФОРТе для Спектрума есть системная переменная 'PRINT'. Если
она равна О, то выдача идет на экран, а если 1, то и на экран и на
принтер. Например, чтобы организовать выдачу на принтер, наберите:
1 PRINT ! <ENTER>
и наоборот, чтобы отключить печать на принтере:
О PRINT ! <ENTER>
Имеется также эквивалент команде БЕЙСИКа COPY. Дайте команду
'COPY <ENTER>1, чтобы получить на принтере копию экрана.
ПЕЧАТЬ ЧИСЕЛ
Простейший способ напечатать число состоит в использовании
слова ФОРТа '.' (точка). С ним Вы уже встречались. По нему
печатается на экране число, содержащееся на вершине стека. При этом
печать выполняется в поле минимальной ширины, то есть перед числом
не ставятся ведущие нули и после него ставится только один пробел.
Форматирование чисел может выполняться применением нижшеприведенных
слов.
'.R' - выполнить печать в поле заданной ширины с выравниванием
по правому краю. Например:
103 4 .R <ENTER> 103 OK
Напечатано число 103 в поле шириной 4 символа.
ФОРТ дает также возможность выполнения форматного
преобразования для организации печати в таком формате, в каком Вам
необходимо.
'<#' - открывает определение форматного преобразования. Для
работы этого слова необходимо, чтобы на вершине стека находилось
число двойной точности. Мы до сих пор пользовались только числами
одинарной точности. Для преобразования числа в двойную точность
служит слово 1S->D', которое преобразует число, находящееся на
вершине стека в двойную точность. В определении форматного
преобразования Вы можете пользоваться следующими словами.
' # ' - поместить следующую цифру в буфер для вывода. При этом
перемещение начинается с цифры наименьшего разряда. Так, для числа
112 первое слово '#' поместит в буфер цифру 2, второе слово '#'
цифру 1 и т.д.
' # S' - поместить в буфер остальные цифры, если они не нуль.
'HOLD' применяется, например, так: '46 HOLD'. По этому слову в
буфер помещается символ, код которого равен 46.
' #> ' - заканчивает форматное преобразование и помещает на стек
адрес и длину выводного буфера. Теперь стринг, содержащийся в
буфере, может быть распечатан командой 'ТУРЕ'.
Пример: предположим, что Вы хотите определить новое слово PIC
для выполнения печати с форматным преобразованием
: PIC < # # # 46 HOLD # # S # > ; <ENTER> OK
Теперь любое число двойной точности будет распечатываться в
формате (.....*.**). Пример:
11473. PIC TYPE <ENTER> 114.73 OK
О. PIC TYPE <ENTER> 0.00 OK
Все это требует практики для освоения работы с
форматизированным выводом.
ДРУГИЕ КОМАНДЫ ПЕЧАТИ
ФОРТ имеет 4 дополнительных команды для облегчения
форматирования информации, выводящейся на экран.
•SPACE' - это слово печатает на экране пробел.
'SPACES' - это слово служит для печати заданного количества
пробелов (эквивалентно 32 EMIT). При этом количество пробелов
задается числом, находящимся на вершине стека. Так, по команде
'5 SPACES <ENTER>' на экран будут помещены 5 пробелов.
'НОМЕ' - это слово устанавливает позицию печати в левый верхний
угол экрана.
'CLS' - очистка экрана и установка позиции печати в левый
верхний угол.
ЦВЕТ, ЗВУК, ГРАФИКА ВЫСОКОГО РАЗРЕШЕНИЯ
Коды цветов - те же, что и в БЕЙСИКе, так 1 - синий и т.д.
Единственное отличие в том, что в ФОРТе параметры идут до команды, а
не после, как в БЕЙСИКе. Например:
БЕЙСИК ФОРТ
INK 1 <ENTER> 1 INK <ENTER>
Примечание: В ФОРТе эти цвета имеют только временный характер и
после команды CLS будут восстановлены исходные цвета, имеющиеся при
включении компьютера. Для того, чтобы сделать цвета постоянными,
служит слово 'PERM'. Например, Вы хотите, чтобы печать выполнялась
белым цветом на красном фоне:
2 PAPER 7 INK PERM <ENTER>
Соответствие прочих команд звука и графики.
БЕЙСИК ФОРТ
INK X X INK
PAPER X X PAPER
FLASH X X FLASH.
BRIGHT X X BRIGHT
INVERSE X X INVERSE
OVER X X GOVER
BORDER X X BORDER
PLOT X,Y X,Y PLOT
CIRCLE X,Y,rad rad,X,Y CIRCLE
DRAW X,Y X,Y DRAW
BEEP X,Y X,Y BEEP
ТАБЛИЦА 6
КОДЫ символов
ТАБЛИЦА 6
0 |
. 7 |
- |
управляющие коды. |
|
|
|
|
|
|
|
8 |
|
- |
DELETE |
|
|
|
|
|
|
|
|
|
9 . . |
. 12 - |
управляющие коды. |
|
|
|
|
|
|
|
13 |
|
- |
ENTER |
|
|
|
|
|
|
|
|
|
14 . |
|
31 - |
не используются. |
|
|
|
|
|
|
|
32 - |
пробел |
48 - |
0 |
64 - |
@ |
80 |
- Р |
96 |
- 4 |
112 |
- P |
33 - |
1 |
|
49 - |
1 |
65 - |
А |
81 |
- Q |
97 |
- а |
113 |
- q |
34 - |
|
|
50 - |
2 |
66 - |
В |
82 |
- R |
98 |
- b |
114 |
- r |
35 - |
# |
|
51 - |
3 |
67 - |
С |
83 |
- S |
99 |
- с |
115 |
- s |
36 - |
$ |
|
52 - |
4 |
68 - |
D |
84 |
- Т |
100 |
- d |
116 |
- t |
37 - |
% |
|
53 - |
5 |
69 - |
Е |
85 |
- и |
101 |
- е |
117 |
- u |
38 - |
& |
|
54 - |
6 |
70 - |
F |
86 |
- V |
102 |
- f |
118 |
- V |
39 - |
1 |
|
55 - |
7 |
71 - |
G |
87 |
- W |
103 |
- g |
119 |
- w |
40 - |
( |
|
56 - |
8 |
72 - |
Н |
88 |
- X |
104 |
- h |
120 |
- X |
41 - |
) |
|
57 - |
9 |
73 - |
I |
89 |
- Y |
105 |
- i |
121 |
- У |
42 - |
* |
|
58 - |
|
74 - |
Л |
90 |
- z |
106 |
- j |
122 |
- z |
43 - |
+ |
|
59 - |
; |
75 - |
К |
91 |
- [ |
107 |
- k |
123 |
- { |
44 - |
, |
|
60 - |
< |
76 - |
L |
92 |
- |
108 |
- 1 |
124 |
- 1 |
45 - |
- |
|
61 - |
= |
77 - |
М |
93 |
- ] |
109 |
- m |
125 |
- ) |
46 - |
|
|
62 - |
> |
78 - |
N |
94 |
- |
110 |
- n |
126 |
- |
47 - |
/ |
|
63 - |
7 |
79 - |
О |
95 |
- |
111 |
- о |
|
|
127 |
|
|
- символ |
"копирайт". |
|
|
|
|
|
|
128 |
|
143 |
- символы |
блочной графики |
|
|
|
|
|
144 |
|
164 |
- символы |
графики пользователя. |
|
|
|
165 |
|
255 |
- ключевые слова |
БЕЙСИКа |
(не |
используются) |
|
|
4. ВЕТВЛЕНИЕ ПО УСЛОВИЮ И ЦИКЛЫ.
ФОРТ содержит операторы условного перехода, которые
предназначены для изменения порядка исполнения программы в
зависимости от того исполняется или нет поставленное условие. Он
также имеет цикловые структуры, предназначенные для повторения
определенной последовательности действий заданное число раз.
Условные переходы и циклы не могут
задействоваться в режиме непосредственного исполнения, а должны
быть введены в определения.
УСЛОВНЫЕ ПЕРЕХОДЫ
Для компиляции условных переходов используются три слова 'IF',
'ELSE' и 'ENDIF'(или THEN). По команде 'IF' ФОРТ анализирует число,
содержащееся на вершине стека для того, чтобы определить по какой
ветви должно идти дальнейшее вычисление. Условный переход имеет
следующую структуру:
: DEFINITION условие IF (ИСТИНА) команда1 ELSE (ЛОЖЬ) команда2
THEN командаЗ ;
Здесь:
: DEFINITION - начало определения
условие - помещает условие (нуль или не нуль) на стек
IF - снимает число со стека и проверяет его
команда1 - исполняется, если число не нуль (ИСТИНА)
ELSE команда2 - Исполняется, если число нуль (ЛОЖЬ)
THEN командаЗ - продолжение в обоих случаях.
'IF' отмечает место, в котором снимается число со стека и
проверяется. Если это не нуль, то выполняются расчеты до слова
'ELSE', откуда вычисления передаются к 'THEN'. С другой стороны,
если на стеке нуль, все, что находится до 'ELSE', пропускается, и
вычисления выполняются после 'ELSE'.
Блок 'ELSE команда2' не является обязательным и может быть по
необходимости опущен. Значение ИСТИНА, находящееся на вершине стека,
очень часто результат исполнения операторов сравнения '<', * = ', '>',
и т.п. (см. главу 1).
Два значения 'ИСТИНА' могут быть объединены использованием
слова ФОРТа 'AND', 'OR', 'XOR'. Например:
AND - дает 'ИСТИНУ', если оба значения - 'ИСТИНА'
OR - дает 'ИСТИНУ', если хотя бы одно из значений 'ИСТИНА'
XOR - дает 'ИСТИНУ', если одно значение 'ИСТИНА', а другое-'ЛОЖЬ'.
Например, Вы хотите определить слово для оценки экзаменационных
работ, скажем, оценка 3 - зачет, менее чем 3 - незачет. Это можно
сделать так:
: EXAM 3 < IF ." НЕЗАЧЕТ " ELSE ." ЗАЧЕТ " THEN CR ; <ENTER> OK
Теперь используйте это слово так:
оценка EXAM <ENTER>
Если оценка меньше 3, то компьютер напечатает НЕЗАЧЕТ, а если 3
и выше, то ЗАЧЕТ.
НЕОПРЕДЕЛЕННЫЕ ЦИКЛЫ
ФОРТ содержит несколько цикловых структур, которые служат для
организации повтора заданного набора команд какое-то заданное число
раз, или пока не будет выполняться какое-то условие, или пока оно
выполняется.
: EXAMPLE BEGIN process condition UNTIL continue; <ENTER> OK
Здесь:
BEGIN - отмечает начало неопределенного цикла,
process - действия, которые надо предпринять в цикле,
condition - подает на стек значение 'ИСТИНА'
UNTIL - снимает значение со стека и возвращается к BEGIN, если
0.
continue - сюда передается управление, если на стеке не 0.
Примечание: 'END' и 'UNTIL' могут применяться взаимозаменяемо.
Например, предположим, что Вам надо выполнить в памяти поиск
16-битного числа и напечатать адрес в котором оно находится. Для
этого мы можем задать слово 'SEARCH'. Предположим, что мы ищем
случай появления нуля, начиная с начала памяти.
: SEARCH 0 BEGIN DUP @ SWAP 1+ SWAP 0= UNTIL 1- . ; <ENTER> OK
Код между 'BEGIN' и 'UNTIL' выполняется в повторе до тех пор,
пока не будет найдено значение, равное нулю. Код после 'UNTIL'
печатает адрес ячейки, в которой обнаружен нуль.
Пример еще одной формы неопределенного цикла:
: ЕХ1 BEGIN condition WHILE process REPEAT continue ; <ENTER> OK
Здесь:
EX1 - начало определения.
BEGIN - отмечает начало неопределенного цикла.
condition - подает на стек значение "ИСТИНА"
WHILE - если значение ИСТИНА, то исполняются действия.
process - описание повторяющихся действий.
REPEAT - возврат к BEGIN.
continue - сюда передается управление, если на стеке 'ЛОЖЬ'.
Рассмотренный выше пример в данном случае будет выглядеть так:
: SEARCH 1 О BEGIN DUP @ WHILE 1+ REPEAT . ; <ENTER> OK
Наконец, последний тип неопределенных циклов имеет форму:
: EXZ BEGIN process AGAIN ; <ENTER>
Такой цикл повторяется неопределенно долго и может быть прерван
только клавишей BREAK.
СТЕК ВОЗВРАТА
ФОРТ имеет два стека - стек параметров и стек возврата. Так
сделано для того, чтобы адреса возврата и данные не могли
перепутаться. Имеется несколько команд для передачи данных с одного
стека на другой.
>R - снимает число со стека параметров и помещает его на
стек возврата.
R> - снимает число со стека возврата и помещает его на
стек параметров.
Примечание: если эти слова используются в определении, то
должны использоваться ОБА, чтобы дополнять друг
друга.
R или I - скопировать число, находящееся на вершине стека
возврата на стек параметров. Стек возврата при этом
не изменяется.
В порядке эксперимента для понимания способов использования
этих команд попробуйте самостоятельно записать определение для слова
'2SWAP', которое должно выполнять операцию замены двух верхних
чисел, находящихся на стеке, на 3-е и 4-е числа. При этом, например,
до операции стек имел бы 1 2 3 4 5, а после '2SWAP' - 1 4 5 2 3, где
3 находится на вершине.
УПРАВЛЯЕМЫЕ ЦИКЛЫ
Управляемые циклы - это циклы, которые выполняются заданное
количество раз. Для этого ФОРТ имеет структуру 'DO...LOOP'. Она
имеет форму:
: TEN-TIMES 10 О DO process LOOP ; <ENTER> OK
Здесь:
: TEN-TIMES - начинает определение.
10 - конечное значение.
0 - начальное значение.
DO - передает параметры цикла на стек возврата,
process - задает последовательность действий.
LOOP - повторяет цикл 10 раз.
Внутри цикла параметр цикла может быть вызван с помощью слова
ФОРТА 'I' . Предположим, что Вы хотите напечатать на экране числа от
О до 9 по одному на каждой строке. Мы можем для этого определить
слово 'N0'.
: N0 10 О DO CR I . LOOP ; <ENTER> OK
Если Вы хотите, чтобы параметр цикла изменялся с шагом,
отличным от единицы, Вы можете использовать структуру 'DO...+L00P',
например:
: BY2 10 О DO 2 +L00P ; <ENTER> OK
Здесь:
: BY2 - начало определения.
10 0 - параметры начала и конца цикла.
DO - место начала цикла.
2 - шаг цикла (помещается на стек).
+LOOP - снимает значение шага со стека и прибавляет его к текущему
значению параметра цикла. Если результат меньше конечного
значения, то цикл повторяется с новым значением параметра
цикла. В противном случае цикл завершается.
Шаг может быть как положительным, так и отрицательным. При
использовании отрицательного шага, цикл отсчитывается вниз, при этом
параметры цикла должны стоять в обратном порядке,т.е. 0 10,а не 10 0
Например, для печати чисел от 10 до 1 может быть определено
следующее слово:
TENT01 0 10 DO CR I . -1 +LOOP ; <ENTER> OK
В этом случае 'LOOP' проверяет не больше ли параметр цикла, чем
конечное значение и повторяет цикл, если это так (ИСТИНА).
Вы можете выйти из цикла 'DO...LOOP' до его естественного
завершения с помощью слова 'LEAVE'. Оно вызывает прекращение
исполнения цикла при очередной встрече 'LOOP' или '+LOOP'.
Например:
: ЕХЗ 10 0 DO I DUP 6 = IF LEAVE ELSE . THEN LOOP ; <ENTER>
Это весьма сомнительный способ распечатать числа от 0 до 5, но
показывает применение этого слова.
ВЛОЖЕННЫЕ СТРУКТУРЫ
Конструкции 'DO...LOOP' и 'IF...THEN' могут содержать внутри
себя такие же конструкции, но только если они вложены правильно.
Т.е. одна конструкция должна быть полностью внутри другой, но они не
могут перехлестываться. Например:
Правильно. -> ...IF 10 0 DO...LOOP THEN...
неправильно. -> ...IF 10 0 DO...THEN LOOP...