6. Целочисленный форт.
6.1 Характерной чертой FP50 является его способность обрабатывать числа и функции с
плавающей точкой, т.е. представленные в десятичной или в показательной форме.
Кроме того, система FP50 включает в себя весьма развитую систему целочисленной
арифметики, операции которой выполняются
значительно быстрее, чем их
аналоги с плавающей точкой. Целые числа, кроме того, занимают меньше памяти.
Разница в скорости выполнения
программ огромна, и ее можно оценить по данным таблицы, содержащей время
выполнения операторов каждого вида:
ОПЕРАЦИИ
|
БЕЙСИК
|
ПЛАВАЮЩАЯ ТОЧКА FP50
|
ЦЕЛЫЕ ЧИСЛА FP50
|
ПРОСТОЙ ЦИКЛ
|
4.2
|
2.8
|
0.05
|
ПЕЧАТЬ ЧИСЕЛ
|
18
|
10
|
2.6
|
СЛОЖЕНИЕ
|
7.5
|
0.7
|
0.23
|
УМНОЖЕНИЕ
|
7.5
|
4.0
|
0.5
|
Довольно убедительно, не правда ли? Скорости выполнения
целочисленных операций и операций с плавающей точкой отличаются в пределах от 2
до 56 раз. Следовательно, для того, чтобы ваши программы работали с
максимальной скоростью, необходимо как можно чаще использовать целочисленную
арифметику.
6.2 В целочисленных операциях все
операнды должны быть целыми (т.е. представлены в целочисленной формате).
Совокупностью целых чисел являются все числа диапазона 0-65535. Кроме того, они
не могут быть результатом нецелочисленных операций. Для иллюстрации сказанного
выше наберите команду;
70000 2 / ;
и она поместит в стек результат
35000, представленный в формате с плавающей точкой, а не целочисленное
значение. Это произошло потому, что один из операндов (70000) выходит за
пределы целочисленного множества.
Аналогично команда:
10
2.8 * ;
не поместит в стек целочисленного
результата и 28 будет представлено в формате с плавающей точкой.
При необходимости в командах,
аналогичных описанным выше, может быть использовано слово
'INT, преобразующее формат с плавающей точкой в целочисленный при
условии, что в TOS находится число из диапазона
0-65535.0.
Следует отметить, что в операциях
с плавающей точкой могут использоваться числа, представленные в различных
форматах.
Это несправедливо для целочисленных операций,
обрабатывающих только значения, представленные в целочисленной форме.
Использование каких-либо других форм представления ведет к возникновению
ошибок.
6.3 Для ввода в стек целого
числа следует набрать:
7
;
I результате которой в TOS будет
размещено число 7, представленное в целочисленном формате.
6.4 Большинство операций с
плавающей точкой имеет целочисленные эквиваленты. Обычно соответствие между
операциями с плавающей точкой и целочисленными операциями указывается
добавлением символа '%' (без пробелов) I—посредственно перед словом,
реализующим целочисленную функцию. Например, целочисленное сложение
записывается как ^', а деление — '%/'. Кроме того, с помощью символа '%'
можно читать целые числа. Целочисленным эквивалентом '.'(т.е. печать TOS)
является комбинация '%.'.
Рассмотрим примеры и указания о
правильности их написания:
7 %. ; — верно
1 2 3.5 * %. ; —
неверно, т.к. не будет целочисленным значением;
2 3.5 %* %. ; — неверно, т.к. 3.5
не является целочислен-щм значением;
2 3.5 INT%.
; —верно;
7.7 %.; — неверно;
70000 %. ; — неверно;
7000 %. ; — верно;
7.3 % . ; — верно (вместо '.'
можно использовать '%.'). ' Ответ здесь будет равен 2 и представлен в формате с
плавающей ТОЧКОЙ.
6.5 Полный список слов целочисленного форта приведен в
Приложении 2. Большинство из них являются полными эквивалентами операций с
плавающей точкой с добавлением к имени Символа '%' и, естественно, подробно не
описываются. Все они выполняются только с числами из целочисленного множества и
темного быстрее, чем их аналоги с плавающей точкой. Это свойство целочисленного
форта необходимо использовать везде, где только возможно.
Некоторые целочисленные слова не
имеют своих аналогов с плавающей точкой. К таким словам относятся '%MOD' и '%XOR', подробно описанные
в приложении 2.
6.6 Целочисленные циклы.
Из таблицы раздела 6.1 видно
превосходство целочисленных циклов перед всеми другими. Их работа ничем не
отличается от циклов с плавающей точкой (см. раздел 5.13) за исключением того,
что не допустимо использование целочисленного эквивалента слова '-LOOP' и индексов циклов с именами Т и 'К', что
свидетельствует о невозможности организации вложенных циклов. Единственной
переменной, управляющей циклом^является '%!', а, эквивалентом слова 'EXITLP' будет 'EXT%L', а не '%EXITLP'.
В качестве примера попробуйте выполнить:
1001 0 %DO 21 0
AT %I %. %LOOP ;
Ну как, быстро работает? Итак, словами целочисленных циклов
являются:
%DO,
%LOOP, %+LOOP, %LEAVE, EXIT%L,
%L.
7. РЕДАКТОР СИСТЕМЫ ФОРТ
7.1 На вашей кассете, сразу же за
системой FP50, состоящей из трех блоков, записана
другая программа, о которой уже шла речь в данном руководстве. Эта программа (ED50) является редактором системы форт.
7.2 ED50 играет роль
альтернативной системы по отношению к FP50. Система ED50 позволяет
редактировать, корректировать и оглаживать форт-программы без каких-либо
трудностей и выполняет все функции экранного редактора. Если вы еще не ощутили
важность этого средства, то приведенный ниже пример поможет это сделать.
7.3 Для перехода в режим
редактирования в среде ED50 необходимо:
— выйти в командный режим системы
FP50, т.е. иметь на экране указатель этого режима ***>. Предполагается, что
вы уже загрузили систему FP50 в компьютер. В командном режиме наберите на
экране строчную букву 'Е' и нажмите 'ENTER';
— включите магнитофон в режим
воспроизведения и загрузите ED50, расположенный на кассете сразу за третьим
блоком FP50;
— после загрузки редактор ED50
начинает работать автоматически. При этом слова, параметры и указатели,
определенные вами ранее, будут автоматически переданы от FP50 в редактор;
— указателем командного режима
ED50 является ###>.
7.4 Если на каком-то этапе работы
в среде ED50 возникает Необходимость возврата в среду FP50 (например для записи
на ленту вашей программы), то для этого в командном режиме прописными буквами
необходимо набрать слово 'RET' и нажать 'ENTER'. После этого перемотайте вашу кассету, установите ее
М начало первого блока системы FP50 и включите магнитофон режим
воспроизведения. После загрузки первого блока система FР50
осуществит автоматический старт и вам будет выдан указатель ее командного
режима'.Отметим, что все результаты вашей работы в среде редактора при этом
будут автоматически переданы системе FP50. Следует заметить, что для перехода
из BD50 в FP50 необходима загрузка только первого блока
системы форт.
7.5 Практически ED50 выполняет все
функции FP50. Однако его размещение в памяти будет несколько другим и, кроме
того, (..цвело обрабатываемых элементов стека снизится с 300 до 150. |_ Как
было отмечено ранее, в среде ED50 была доступна ко-Кмавда
'SAVE', осуществляющая сохранение ваших программ на , ленте и описанная
в разделе 5.6. Для этого в конце редакти-? рования необходим возврат в среду
FP50. | Следует указать также на то, что в ED50 невозможно определение
графических символов пользователя (UDG) и использование
пробелов для того, чтобы начать ввод слов языка с новой Строки.
Во всех других случаях (описание
слов, манипулирование содержимым стека, выполнение программ и т.п.) функции
FP50 и ED50 практически совпадают.
7.6 Для ознакомления с мощными
возможностями редактора |( ED50 выйдите в командный режим его работы (т.е.
получите на экране указатель ###>) и определите, например, слово 'TEST':
; TEST 5
0 DO 127
EMIT LOOP ;
и затем выполните команду: TEST ;
которая осуществит вывод на экран пяти символов без
пробелов. Теперь определите слово 'TEST2':
;
TEST2 TEST CR 1
BRIGHT TEST CR 0 BRIGHT TEST ;
и выполните команду:
TEST2 ;
которая выведет на экран то же самое, что и
'TEST', но с одним ярким символом.
Переопределим функцию слова 'TEST',
введя:
; TEST
10 0 DO I LOOP ;
выполним последовательно команды:
TEST ;
TEST2
;
для того, .чтобы убедиться, что
название слова 'TEST' изменилось, а 'TEST2' использует
в своей работе новую функцию 'TEST'. Отметим, что FP50 не позволяет осуществлять такого непосредственного
переопределения названия слов, а требует сначала удалить слово из словаря
системы, что ведет к уничтожению всех слов, определенных с его помощью. Следует
отметить, что при попытке переопределить слово в среде ED50,
имя которого уже существует в словаре системы, вам будет выдано сообщение:
YOU
ARE REDEFINING .EXISTING WORD?
(переопределить уже существующее
слово?)
Если в этом действительно есть
необходимость, то нажмите прописную букву 'Y'. Введение
прописной буквы 'N' отменит переопределение введенного
вами слова.
7.7 Важной особенностью ED50
является поддержание им многих функций экранного редактора, позволяющих
изменять назначение слова без полного перебора описывающих его назначение слов,
что весьма удобно, если это описание достаточно длинное.
Для использования экранного
редактора необходимо в командном режиме ED50 ввести строчную букву 'Е'. После
этого на запрос системы введите имя слова, требующего редактирования. В
качестве примера наберите слово 'TEST' (если данного
слова нет в словаре системы, то будет осуществлен возврат в командный режим ###>).
После ввода имени слова на экране будет отображено описание его функций с
мерцающим курсором в самом начале. Курсор можно перемещать по экрану нажатием
клавиши 'CAPS SHIFT' и одной из клавиш 5, 6, 7 и 8,
осуществляющих движение курсора влево, вниз, вверх и вправо соответственно.
Набор нового символа осуществляется непосредственно на месте символа, который
требует корректировки. Для удаления символов и замены их пробелами используется
клавиша 'SPACE'. При вводе символов курсор будет
автоматически перемещаться на следующее знакоместо.
При длительном нажатии на любую
клавишу включается режим автоповтора.
По окончании редактирования
конкретного слова необходимо нажать клавишу 'ENTER'. В
этом случае вам будет выдано сообщение, описанное в разделе 7.6, на которое
надо отреагировать таким же образом. Результатом успешного редактирования
является выход в командный режим редактора ED50.
Для экстренного перемещения
редактирования одновременно нажмите клавишу 'SYMBOL SHIFT'
и 'Q'. Это завершит режим редактирования и вернет вас в
командный режим без изменений, сделанных в слове в процессе его корректировки.
Единственным ограничением на
процесс переопределения слов является то, что происходит потеря символов
управления печатью строк, а точка с запятой (;) на экране должна быть только
одна. Исправления, сделанные на экране, воспринимаются компьютером как
определение слова, набранное от начала до конца.
Существует несколько правил,
обеспечивающих безопасность вашей работы в среде ED50:
1. Нельзя удалять (забывать) слово
из словаря сразу после его редактирования. Удалены могут быть только те слова,
последней операцией над которыми было их определение. Допустим, вы выполнили
последовательность действий: определили слова •TEST' и
'TEST2', затем отредактировали слово 'TEST' и наконец
заново определили слова 'TEST2' и 'TEST4'. После этого
вы имеете право удалить только слова 'TEST2' и 'TEST4', но не 'TEST'.
2. Не следует делать попытки
редактирования исходных слов системы FP50, т.к. в их состав входят
машинные коды, которые являются нередактируемыми.
7.8 Экранный редактор является
мощным инструментом выявления и устранения программных ошибок.
7.9 Если в процессе работы в среде
ED50 вами использована команда 'BREAK' или получено
сообщение об ошибке, то для возврата в редактор следует выполнить команду 'GOTO 60', а ни в коем случае не
'RUN'.
8. КОРОТКО О РАЗНОМ.
•8.1 Игра
Сразу после трех блоков FP50 и одного блока ED50 на кассете
записана ФОРТ-игра, носящая имя 'GAME' и состоящая из
трех блоков. Она была создана с использованием конструкций языка ФОРТ и
достаточно полно иллюстрирует его возможности. Сбросьте ваш компьютер в
исходное состояние и загрузите игру с помощью команды
'LOAD'"". После появления указателя ***> введите слово: GAME;
или же наберите команду 'VLIST' и ознакомьтесь с новыми словами словаря системы,
реализующими эту игру. Напомним, что само слово 'GAME'
определено в терминах других слов, которые, в свою очередь, определены в
терминах ... и т. д.
Целью игры является переворот всех
требуемых кубиков желтой стороной вверх и восстановление на экране исходного
рисунка. В самом начале игры необходимо ввести ее уровень от 1 до 9. Советуем
начать с первого. После этого компьютер перемешает кубики и можно начинать
игру. Для того чтобы изменить цвет кубика на желтый, необходимо ввести его
координаты: сначала строчную букву (A-Z), а затем число
(1-16). Если число состоит из одной цифры, то ему должен предшествовать 0.
Проблема состоит не только в том, чтобы изменить цвет кубиков, но и все девять
нужно разместить вместе. Попробуйте ввести 'АОГ, и через некоторое время вам
все станет ясно. По окончании игры вы снова окажетесь в командном режиме. Для
продолжения игры вам необходимо опять выполнить команду:
GAME;
Если у вас появится интерес к
тому, как сделана эта игра и что представляют собой ее слова, то с помощью
клавиши 'CAPS SHIFT' и '6' вернитесь в командный режим
и загрузите редактор ED50, как это описано в главе 7. Используя возможности
экранного редактора, ознакомьтесь с описанием новых слов, используемых в игре:
SCREEN,TURN,9, INP3,RAND,SKILL,F1NI?, GAME.
Например, описание слова 'GAME' выглядит следующим
образом:
; GAME SKILL BEGIN INP3.TURN 9 FINI? UNTIL WAIT ;
т.е. эта программа выглядит
элегантнее и более структурирована, чем любая другая, написанная на
БЕЙСИКЕ._________
• 8.2 Программирование на
низком уровне
Этот раздел должен быть прочитан
теми, кто хорошо знаком С языками низкого уровня, такими как АССЕМБЛЕР и
машинные коды. Здесь описаны способы доступа к адресам и их изменение,
управление регистрами и выполнение программ в машинных кодах в среде FP50.
Распределение памяти компьютера
при размещении в ней системы FP50 представлено в приложении 3.
• 1) %AND,
%OR. %XOR — 16-разрядные операции, работающие с целочисленным множеством
(т.е. 16-разрядными беззнаковыми числами) и дающие в результате целочисленные
значения.
• 2) Вызов и сохранение
Адреса памяти могут иметь только
целочисленный формат. Командам '@' (FETCH- вызвать) и
'Г (STORE — сохранить) должны предшествовать: 'НИЧЕГО*
— при обработке 5-ти байтовых значений с плавающей точкой;
'%' — для 16-ти разрядных беззнаковых
целых;
'С' — для символа или байта;
'Р' — для порта;
'FETCH'
читает значение, адресуемое TOS и помещает его в стек.
"STORE"
пересылает значение стековой части 20S в адресуемую TOS
область памяти.
Для выполнения вызова и сохранения
используются команды:
С! Р!
• 3) Чтение и прирашение
? — выполняет @%, т.е. явное
чтение;
%? — выполняет %@%
С? — выполняет С@%
%+! — (целочисленное приращение)
увеличение двухбайтового целого, размещенного по адресу из TOS, на
целочисленное значение из 20S. Команда 65535 %+! осуществляет уменьшение
значения.
+! — (приращение) увеличивает
пятибайтовое значение с плавающей точкой, размещенное по адресу из TOS, на
значение из 20S.
• 4) Основные команды
Все нижеследующее относится к
целочисленным операндам, результатам и функциям.
FILL —
заполняет число байтов, заданное значением 20S (минимум
2 байта) и начинающееся по адресу, заданному значением 30S,
значением, размещенным в TOS.
ERASE —
заполняет нулями число байтов, заданное значением TOS (минимум 2 байта) и
начинающееся по адресу, заданному значением 20S.
DELETE —
заполняет кодом 32 (пробел в коде ASCII) число байтов,
заданное значением TOS (минимум 2 байта) и начинающееся но адресу, заданному
значением 20S.
CMOVE —
копирует в TOS однобайтовое число, размещенное по адресу, заданному в 30S.
%MOVE —
копирует в TOS однобайтовое число, размещенное по адресу, заданному в 20S.
MOVE —
используется для обработки двухбайтовых чисел и выполняет функции 'CMOVE'. При
обработке пятибайтовых чисел функции 'MOVE' также
аналогичны 'CMOVE'. При размещении блока памяти, принимающего передаваемые
байты в более старших адресах, чем блок-источник, эти блоки не должны
пересекаться.
type — печатает количество символов,
заданное значением
TOS и размещенных, начиная с
адреса, заданного значением 20S
(например, 505 300 TYPE;)
CDUMP —
печатает числовое значение, состоящее из числа байтов, заданного в TOS, и
начинающихся с адреса, расположенного в 20S.
%dump — печатает числовое значение,
состоящее из числа двухбайтовых блоков, заданного в TOS и начинающихся с
адреса, расположенного в 20S.
DUMP —
печатает числовое значение, состоящее из числа пятибайтовых блоков, заданного в
TOS и начинающихся с адреса, расположенного в 20S.
FIND —
выдает компиляционный адрес следующего за ним слова без запуска его на
выполнение. Используется, для нахождения одного из слов, отображаемых по
команде 'VUST', и выдачи его компиляционного адреса,
например:
FIND TEST .;
отображает компиляционный адрес слова 'TEST'.
WRDSCH —
(набирается строчными буквами) осуществляет в словаре поиск слова, имя которого
размещено в шести байтах начиная с адреса 23264. Команда возвращает адрес точки
входа в словарь или 0 (если слово не найдено) в регистровую пару 'ВС'.
Каждая точка входа в словарь
содержит шестибайтовое имя вхо-'Д1, за которым следует двухбайтовый
компиляционный адрес.
FLGTST —
(набирается строчными буквами) осуществляет Логическую операцию 'ИЛИ' (OR) со всеми битами в TOS и устанавливает флаг '7',если
результат равен 0. Команда использует слова 'IF', 'WHILE'
и 'UNTIL', которые считают значение О — как
"ложь", а все ненулевые значения — как "истина".
EXECUTE0
— осуществляет передачу управления по адресу, размещенному в TOS.
EXPECT —
вводит некоторое число символов, заданное в TOS, от клавиатуры и
размещает их, начиная с адреса, заданного значением 20S. Ввод может быть
закончен и раньше путем нажатия ENTER. В этом случае
запишется код 13.
-TRAIL —
здесь значение 20S берется в качестве начального адреса строки знаков,
размещенной в памяти, а в TOS занесена ее длина, включающая следующие за
строкой пробелы. Таким образом, оставляя неизменным значение 20S и меняя
значение TOS, возможно отсечение конечных пробелов, следующих за строкой
знаков.
COUNT —
используется для чтения таблицы байтов. Байт, Прочитанный по адресу,
размещенному в TOS, помещается в вершину стека. Адрес сохраняется в 20S и
возрастает для чтения Очередного байта. • 5) Управление несколькими стеками
Для своей работы система FP50 использует три стека: стек , возврата, стек данных и
стек вычислений. Стек возврата размещается в регистровой паре процессора Z80 'SP' и используется Словами 'PUSH, POP,
CALL и RET'. ФОРТ использует этот стек для
хранения адреса возврата и переменных, управляющих циклом. Он состоит из
двухбайтовых элементов данных. Стек данных также размещается в регистровой паре
'SP' сразу же после выполнения команды 'STKSWP'.
Повторное использование 'STKSWP' ведет к передаче
регистровой пары 'SP' для размещения в ней стека возврата. Именно стек данных
описан во всех предыдущих главах руководства. Он состоит из шестибайтовых
элементов (5 байт для чисел с плавающей точкой и одного фиктивного байта или
двух байт для размещения целого числа, трех нулевых байтов и одного
фиктивного).
Стек вычислений использует
подпрограммы ROM компьютера и обрабатывает пятибайтовые
элементы, представленные в формате с плавающей точкой.
STKSWP —
переключает использование регистровой пары
'SP'
стеком данных либо стеком возврата.
r> —
передает целочисленное значение из стека возврата в
стек данных CSP'
используется стеком возврата).
R® — копирует
одно целочисленное значение из вершины стека возврата в стек данных CSP'
используется стеком возврата).
SPTOCS —
СТО' набирается строчными буквами) передает шестибайтовый элемент из стека,
использующего в данный момент регистровую пару 'SP', в пятибайтовый элемент
стека вычислений.
2TOCS —
СТО' набирается строчными буквами ) передает
два элемента из стека данных в
стек вычислений CSP' используется стеком возврата).
CSTOD —
СТО' набирается строчными буквами ) передает один элемент стека вычислений в
стек данных CSP' используется стеком возврата).
• 6) Системные переменные
Системными переменными являются:
'DF-CC' —
для позиционирования печати:
23681 — для фиксации смещения с
помощью слов 'WORD' внутри области
'PAD';
23728 — для хранения данных стека,
не использующего в данный момент регистровую пару 'SP';
23662 — для временного хранения
информации.
• 7) Ввод машинных кодов
При необходимости в состав слов
системы FP50 могут быть введены элементы, созданные в
машинных кодах. Для этого следует записать:
МС N1 N2 N3 ...
NM END где 'МС' и 'END' вводятся строчными
буквами, а N1, N2 ...NM являются байтами машинного
кода, представленными в десятичном формате. Для перехода на новую строку
используйте клавишу 'ENTER', а не несколько подряд
следующих пробелов.
• 8) Выполнение подпрограмм
Запуск на выполнение подпрограмм
(слов), отображаемых по команде 'VUST', осуществляется
словом 'NUMBER', т.е. числом, занесенным в стек, словом 'PRSTRG' в форме "строка знаков" или путем поиска
слов с помощью 'WRDSCH'. Все три слова набираются
прописными буквами. Однако не следует делать попыток выполнить эту
операцию. _____
• 8.3 Рекомендации по дальнейшему
изучению языка ФОРТ Данное руководство не претендует на роль учебника для
овладения языком ФОРТ в совершенстве, а только служит для ознакомления с
особенностями системы FP50. Для дальнейшего изучения языка рекомендуем
обратиться к книге Л.Броуди "Начальный курс программирования на языке
ФОРТ" М., Финансы и статистка, 1990.