Системные программы для ZX-Spectrum 1992 г.

FORTH - форт (FORTH) в настоящее время является одним из популярнейших языков программирования.


ФОРТ

1.1 Форт FORTH) в настоящее время является одним из популярнейших языков программирования. Он был разработан в начале 70-х годов. Создатели языка Ч.Мур (C.MOORE) и Э.Разер (E.RAZER) в то время были сотрудниками национальной радио-астрономической обсерватории США. Следует отметить, что слово "FORTH" — это не аббревиатура или какое-либо сокращение. Это торговый знак калифорнийской фирмы "FORTH".

1.2 Форт является стек-ориентированным языком программирования, в основу которого положено использование польской обратной записи (ПОЗ). Преимуществами форта являются: достаточно большое быстродействие, экономичное использование памяти компьютера и возможность создания сложных программ на основе простых для понимания блоков. Форт занимает промежуточное положение между бейсиком (который работает медленнее и не так эффективно использует память) и машинными кодами (которые более быстродействующие и компактные).

1.3 Итак, форт с плавающей точкой версии FP50 является одним из языков программирования, используемых в компьютере ZX-SPECTRUM 48K. Естественно возникает вопрос: а разве не бейсик является основным языком вашего компьютера? Если да, то каким же образом используется форт? Ответом является то, что процессор вашего компьютера Z80 является единственной "думающей" частью спектрума, которая не понимает ни бейсика, ни форт, ни что-нибудь отличное от своих машинных кодов. При включении питания процессор автоматически начинает выбирать и выполнять команды машинного кода, размещенные в ПЗУ (ROM). Именно эти команды дают возможность компьютеру воспринимать, интерпретировать и выполнять программы, написанные на бейсике. Эти команды бейсика с помощью программ ПЗУ интерпретируются процессором в последовательности стандартных действий, которые затем выполняются шаг за шагом. Таким образом, именно программы в машинных кодах, хранящиеся в ПЗУ, дают возможность компьютеру обработать команды бейсика. Программирование на бейсике вряд ли когда-нибудь потребует от вас знания, как же работают эти самые машинные коды.

Все сказанное выше в полной мере относится и к FP50, работа которого основана на использовании бейсик-программ и соответствующих им машинных кодов. Именно их вы будете загружать в компьютер на этапе подготовки к работе с фортом. Считанные с магнитной ленты программы” машинные коды и данные размещаются в оперативной памяти (RAM), создавая видимость изменения содержимого ПЗУ (ROM) и давая тем самым возможность программирования на форте. Все программы, загружаемые в компьютер на этапе подготовки его к работе с фортом, для пользователя будут "прозрачными", т.е. не требуют от вас знания их точек входа и выхода. Исключением могут быть случаи прекращения работы программы по команде "BREAK" с дальнейшим восстановлением процесса функционирования форта.

И наконец следует отметить, что SPECTRUM работает с фортом нисколько не хуже, а порой и лучше компьютера, работающего с бейсиком. Основанием для этого утверждения служит то, что бейсик — ориентированная система, полностью расположенная в ПЗУ, а форт-система (FP50) загружается в более быстродействующую оперативную память. 1.4 Особенности использования форт. Программы, написанные в системе форт, решаются в тысячу раз быстрее аналогичных программ на бейсике. Это обусловлено тем, что форт работает практически со скоростью машинных кодов, в то время как команды бейсика всегда требуют интерпретации. Таким образом, форт всегда предпочтительней использовать там, где бейсик не удовлетворяет своим быстродействием, причем программы, написанные на форте, более компактны.

По сравнению с бейсиком программирование на форте более наглядно, легко изучаемо и более профессионально. Кроме того, в отличие от бейсика, форт позволяет выполнять структурное программирование.

Достоинства форта привели к тому, что многие обучающие курсы уже переведены с бейсик-ориентированных систем на форт-ориентированные. Кроме того, обладая свойством "дружественности", FP50 значительно дисциплинирует программиста, что несомненно скажется при освоении языков более высокого уровня, таких как паскаль, кобол или фортран.

Способность форта выполнять практически любые стековые операции делает его по существу аналогом машинных кодов и облегчает изучение языков более низкого уровня, таких как ассемблер или сами машинные коды. И, наконец, это неплохое развлечение.

1.5 FP50 содержит все структуры стандартной версии FORTH 79. Поэтому средства, освоенные вами в FP50, с успехом могут быть использованы в большинстве версий языка форт. Следует, однако, отметить, что программное обеспечение, созданное для FORTH 79 (или его упрощенной версии FIG FORTH), перед работой в среде FP50 может потребовать ряд несущественных доработок.

Характерной особенностью FP50 является его способность обрабатывать целые числа из множества от -32767 до +32767 с точностью до целого числа, представленные в показательной форме от -2Е127 до +2Е127 с точностью до десяти знаков после запятой.

 

2. ОСНОВЫ ЯЗЫКА ФОРТ

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

Однако, если вам нравится идти более тернистым путем освоения языка (т.е. чесать левое ухо правой рукой), то загрузите форт с помощью команды LOAD " " и вперед!!

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

2.2 Существует две концепции, положенные в основу понимания любого форт-диалекта: концепция слова (WORD) и концепция стека (STACK). Без уяснения этих двух понятий дальнейшее изучение языка невозможно.

2.3 Слово.

То, что вы вводите в компьютер (команда, число, символ, имя, переменная), в рамках форта называется "словом". Принцип программирования на форте основан на том, что вы обучаете компьютер выполнению требуемых операций путем задания и описания новых слов.

Сначала FP50 начинает работать с некоторым набором слов, которые в нем определены заранее. Эти слова загружаются в компьютер из файла "DATA" (см. раздел 3.1). Для просмотра ••• всех слов, находящихся в исходном состоянии в словаре системы FP50, следует обратиться к приложениям 1 и 2. Несмотря на то что все эти слова весьма полезны, вы ничего не сможете сделать, используя их по отдельности. В исходном списке слов FP50 вы не найдете ничего, что бы вам помогло сделать программу "шахматы" или "космическая война". Что же делать? Вывод один :нужно научить ваш компьютер понимать новые слова, которые выполняли бы требуемые вам функции. Для этого вы должны описать новое слово в терминах слов, уже известных вашему FP50. В одном новом слове можно объединить функции пяти, десяти или двадцати ранее известных слов. На основе только что созданных слов можно создать новые слова и т.д. В конце концов ваша программа будет представлена одним-единственным словом, созданным на основе слов, описанных в словаре системы FP50.

2.4 Глубокое понимание словарной концепции форта очень важно. Попытаемся пояснить ее, опять обратимся к бейсику. По существу, программы, написанные на бейсике, тоже состоят из слов, таких, как 'LET', 'FOR', 'NEXT' и т.д., однако бейсик-программа создается непосредственно из этих слов, и вы не сможете задать их одним словом, состоящим из перечисленных выше. Если вы все же попробуете это сделать, то непременно получите сообщение об ошибке. В отличие от сказанного выше форт-программа и форт-слово могут состоять из совокупности исходных слов системы FP50 и слов, определенных вами, что обеспечивает достаточную гибкость системы программирования.

В заключение необходимо отметить, что в бейсике концепция слов частично реализована путем использования подпрограмм. Например, если в вашей бейсик-программе возникла необходимость чередующейся окраски экрана то в белый, то в черный цвет, то необходимо написать подпрограмму, реализующую эту функцию и начинающуюся, скажем, со строки 2000. На соответствующем шаге основной программы путем использования команд 'GOSUB 2000' выполняются описанные в подпрограмме действия. В известном смысле 'GOSUB 2000' является словом,

которое вы определили сами, а его использование в бейсик-программе ведет к выполнению соответствующих ему функций, описанных вами в подпрограмме. Аналогично и в форте. Вы выбираете какое-либо слово, например 'PATTERN' (рисунок), и с помощью уже известных системе слов описываете его действие. Теперь всякий раз, когда компьютеру встретится слово 'PATTERN', он будет рисовать на экране соответствующий этому слову рисунок.

2.5 Стек

Использование стека является очень важной особенностью языка форт. Стек содержит числа. Числа, размещенные в стеке, используются для различных вычислений, результаты которых также помещаются в стек. Стек всегда можно представить в виде колоды карт с написанными на них числами. Последняя карта, которую вы кладете в колоду, будет всегда первой, которая выбирается из колоды обратно. Следовательно, работу со стеком можно представить и описать следующим принципом: последним пришел (LAST IN) — первым обслужен (FIRST OUT), сокращенно — 'UFO'. Каждый раз. когда вы помещаете в стек новое число, число, занимавшее вершину стека, становится вторым числом стека.

В данном руководстве термин 'TOS' используется для обозначения вершины стека, '20S' — второго элемента стека, '30S' — третьего элемента, считая от вершины, и тд.

Приведенная ниже диаграма должна помочь вам представить принцип построения стека:

TOS 7

 

 

 

 

 

20S 6

 

 

 

 

 

30S 4

 

 

 

 

 

 

 

Диаграмма отвечает случаю, когда в стек последовательно были размещены числа 4, 6 и 7.

Таким.образом, стек — это достаточно просто. 2.6 Числа, помещаемые в стек, могут быть целыми (3,-5), представленными в формате с фиксированной точкой (3.8.-0.7) или в показательной форме с плавающей точкой (+1.7Е19.2.8Е-5). Диапазон представления чисел и их точность полностью совпадают и соответствуют бейсику, т.е. максимальное число равно +1.7Е38, а минимальное соответствует -1.7Е38.

2.7 В разделе 2.5 понятие стека системы РР50 дано очень упрощенно. Реально в форте используются три стека: стек данных пользователя, стек возврата и стек вычислений. Однако на -.этом этапе освоения языка необходимо детально представить только назначение и работу первого из них. Поэтому слово "стек" далее будет использоваться только по отношению к стеку данных пользователя. Остальные два стека будут описаны в главе 8.

3. ЗАПУСК СИСТЕМЫ ФОРТ

3.1 Перед загрузкой системы FP50 необходимо осуществить сброс компьютера в исходное состояние командой

RANDOMIZE USR 0 которая имитирует включение питания, или нажать клавишу

'RESET'.

Вслед за этим следует набрать команду 'LOAD " '". На ленте с FP50 записано три файла: программа с именем 'FORTH' и два файла с байтами и именами 'DATA' и 'ROUTINES'. Загрузка системы производится автоматически и длится около 2-х минут. Если загрузка прошла успешно, то вы услышите короткий звуковой сигнал, а в нижней части экрана появится указатель

• * * >

Вслед за указателем следует мерцающий курсор CL' — в режиме строчных букв, или 'С' — в режиме заглавных. Переключение режимов осуществляется обычным образом).

Сказанное выше свидетельствует о том, что вы находитесь в командном режиме и система ждет ваших указаний. Если у вас возникает необходимость в использовании редактора ED50, то следует обратиться к главе 7.

Отметим, что большинство исходных слов FP50, размещенных в словаре системы, состоят из заглавных букв (смотри приложения 1 и 2).

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

— Между двумя действиями должен всегда присутствовать разделитель. В системе приняты два типа допустимых разделителей — клавиша 'ENTER' и клавиша 'SPACE'. По существу, эффекты от их использования идентичны. А выбор одного из них зависит только от вас. Единственное отличие 'SPACE' от 'ENTER' состоит в том, что 'ENTER1 нельзя использовать для разделения слов в команде. Для этих целей используется 'SPACE'. Ввод разделителя 'ENTER' сообщает компьютеру о необходимости компиляции (перевод в более простые команды) всех слов, введенных до этого момента.

— Следует очень аккуратно относиться к вводу пробелов между словами (это касается и примеров, приведенных в данном руководстве). Причиной 90% ошибок является пропуск пробела в том месте, где он необходим. Разделители в примерах данного руководства показаны пробелами между словами. В форте (к несчастью!!) существует слово с именем 'SPACE'. Если в процессе рассмотрения примеров возникает необходимость использования слова 'SPACE', то в качестве примечания оговаривается, что оно состоит из пяти букв (смотри раздел 3.7).

— Недопустимо использование ссылок внутри ссылок и скобок в теле команды.

— Если команды набраны не на соответствующем им регистре, то в большинстве случаев они не воспринимаются системой (см.приложение 1 и 2).

— Нельзя использовать комбинации клавиш клавиатуры спектрума для набора имен (например: 'SYMBOL SHIFT' и 'Y' для получения 'AND'). FP50 не распознает ни одну из этих комбинаций, поэтому слова всегда набираются по буквам.

3.3 Источники ошибок

В случае возникновения ошибки выполнение программы будет остановлено, произойдет возврат в среду бейсика, а в нижней части экрана отобразится сообщение об ошибке. Источником ошибки чаще всего является: неверное использование цветов, арифметически невыполнимые операции, ответ 'N' на запрос свертки экрана 'SCROLL?', использование 'BREAK' и т.д. Для возврата в среду FP50 необходимо ввести одну из следующих команд:

GOTO 4051 или GOTO   3

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

3.4 Использование FP50.

Допустим, что вы выполнили все указания раздела 3.1. В нижней части экрана у вас появится указатель ***> и мерцающий курсор. Если в процессе экспериментов вы "потеряли" указатель, то следует ввести точку с запятой (;) и нажать клавишу 'ENTER'.

3.5 Введем в стек несколько чисел. Допустим, первым из них будет число 7. Эта операция выполняется путем последовательного нажатия клавиш '7', 'SPACE' (или 'ENTER', см. раздел 3.2), ';' и вслед за этим клавиши 'ENTER'. На экране это будет выглядеть следующим образом:

* * • > 7    ;

точка с запятой, во-первых, отмечает конец введенной команды и, во-вторых (если команда набрана верно), после нажатия клавиши 'ENTER' ведет к выполнению команды и возврату в командный режим.

Таким образом, считаем, что вы уже поместили число '7' в вершину стека (т.е. TOS"/). Следует отметить, что перед началом работы со стеком необходимо убедиться, что он пуст.

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

STACK: 1 OK

(если стек содержит 5 элементов, то будет отображено количество его содержимого в виде 'STACK:5') и вслед за этим появится указатель командного режима ***>. Отметим, что при вводе значений целых чисел, чисел с фиксированной или плавающей точкой, не должно быть пробелов между знаком числа и цифрами, между цифрами одного числа, между значением числа и его показателем степени. Если пробелы все же имеют место, то компьютер воспринимает это как попытку ввода двух различных чисел.

В качестве примера рассмотрим ввод в стек чисел, представленных в различной форме:

***>3.7 ; (десятичное число)

***>1Е—3 ; (число в показательной форме)

***>- 0.05 ; (отрицательное число)

***>4 5 11 ; (одновременный ввод в стек трех чисел)

При этом ТОS-11, 20S=5, 30S-4).

Аналогичным образом в стек может быть введено любое количество чисел. Обратите внимание на то, что пробелы недопустимы между числами и десятичными точками, числами и символами. Во время заполнения стека компьютер будет подсчитывать и отображать количество занятых элементов стека. Эта обратная часть часто бывает очень необходимой. Система FP50 может одновременно обрабатывать до 300 элементов стека, а при работе с редактором ED50 — до 150. Преднамеренное переполнение стека крайне опасно и всегда ведет к возникновению ошибки. Если же по тем или иным причинам такое переполнение все же произошло, то "мусор" с помощью операций, описанных ниже, может быть достаточно легко удален из стека.

3.6 Теперь ознакомимся со. способом выбора элементов стека для отображения их на экране. Напомним, что клавиши 'SPACE','ENTER' и ';' являются разделителями (см. раздел 3.2), а не словами форта. Первое слово системы форт, с которым вы должны познакомиться, — это точка (.).

Слово '.' (точка) на клавиатуре SPECTRUM соответствует символу, используемому вами в качестве десятичной точки в примерах, приведенных выше. Точка дает указание компьютеру на выбор из стека и ввод на экран числа, занесенного в стек последним (т.е. 'TOS').

Попробуйте набрать:

* * •> . :

(помня о необходимости ввода пробела между двумя символами) и нажмите клавишу 'ENTER'. По этой команде компьютер выберет число, размещенное в вершине стека, и отобразит его на экране. Если вы выполнили все предыдущие команды, то это будет число 11. После печати выбранное из стека число удаляется, а сам стек становится на один элемент короче.

3.7 Теперь попробуем выбрать из стека и вывести на экран последовательно несколько чисел отдельными командами или одной командой. Последовательность отображений чисел на экране будет обратной по отношению к последовательности их ввода в стек (Помните? Дисциплина обслуживания стека соответствует 'LIFO').

Для примера наберите команду;

•**>3 8 10 201 ; (ввод в стек чисел 3, 8, 10, 201)

и нажмите клавишу 'ENTER'. После этого выполните команду:-

• * * > .    .    .    .    ;

По этой команде на экран будет выведено 2011083, что подтверждает описанный выше порядок обработки стека: первым выбрано из стека значение 'TOS-201', выведено на экран, a TOS стало равным 10 и т.д. Отметим, что вывод чисел из стека на экран осуществляется без пробелов между ними.

Пробелы, выведенные между точками в команде, служат лишь разделителями между шагами ее выполнения. Если такой пробел случайно окажется пропущенным, то система FP50 выдаст сообщение '.„-NOT KNOWN' (непонятно). Для отделения друг от друга значений используется форт — слово 'SPACE', набираемое по буквам в режиме заглавных букв. Для этих целей недопустимо использование клавиши 'SPACE'.

Теперь попробуйте выполнить команду:

••*>3 8 10 201 ;

и затем команду:

•**>. SPACE . SPACE . SPACE . ;

и вы получите выходной результат в более наглядном виде.

3.8 Если стек пуст, то не рекомендуется использовать команды выборки его элементов. В случае, когда это все же произошло, компьютер будет показывать содержимое элементов стека с номерами -1,-2,-3 и т.н., при этом вы вторгаетесь в область переменных (VARIABLE AREA) системы FP50 и портите ее содержимое. В этой ситуации необходимо ввести некоторое число элементов стека обратно, несмотря на то, что их значения могут оказаться отличными от требуемых.

3.9 Вы, наверное, уже заметили, что после ввода очередной команды с помощью клавиши 'ENTER' следующий указатель ***> появляется не сразу. На экране появляется сообщение:

COMPILING — PLEASE WAIT

(подождите завершения компиляции), а команда выполняется шаг за шагом. Все это говорит о нормальной работе FP50. Выдача компьютером сообщения '...-NOT KNOWN' (непонятно) свидетельствует о том, что вы ввели слово, отсутствующее в словаре системы FP50. Возможно, это ваше собственное слово, но вы просто забыли описать его или произошла ошибка при его наборе. Причиной ошибки может стать также пропуск пробела- между двумя словами или между словом и числом. Возникновение ошибок не должно приводить вас в отчаяние: не ошибается тот, кто ничего не делает!! Необходимо

просто правильно набрать символы, расположенные перед сообщением '-NOT KNOWN'. Допустим, вы ввели команду:

***>5   6   7;

(пропущен пробел между 7 и ;) компьютер выдаст сообщение:

7; -NOT KNOWN C7; НЕПОНЯТНО)

CONTINUE DEFINITION: (ПРОДОЛЖАТЬ ОПРЕДЕЛЕНИЕ:)

Теперь вам остается ввести только '7 ;', а не набирать всю команду заново. В этом случае SPECTRUM выполнит всю введенную вами команду, отобразит сообщение 'ОК!' (Все в порядке!) и снова возвратит вас в командный режим. Поясним, что если в ответ на запрос системы:

CONTINUE DEFINITION:

вы введете:

5 6 7 ;

то компьютер выполнит действия, соответствующие команде:

*••>5   6   5   6   7    ;

что не будет соответствовать тому, что вы хотели сделать с самого начала.

3.10 Следует отметить, что вы можете получить сообщение •CONTINUE DEFINITION:' для невыполненной команды, хотя, на первый взгляд, ошибки в ней могут быть и не обнаружены. Здесь следует напомнить, что все команды должны заканчиваться символом ';', а возврат в командный режим описан в разделе 3.4.

3.11 Использование принтера.

Если к вашему компьютеру подключен принтер, то в системе FP50 существуют три команды, подтверждающие его использование. Они набираются только прописными буквами:

***>Z ; — копирование содержимого экрана на принтер,

***>PRON ; —переключение ввода с экрана на принтер,

***>PROFF ; —восстановление режима ввода информации только на экран

Как ни странно, но эти команды не являются словами языка форт, они выступают частью операционной системы FP50. Однако эти команды могут быть частью других команд, составленных из других слов языка форт.

Существенным отличием описанных выше команд управления принтером является невозможность заставить систему FP50 "забыть" их назначение, что не относится к любым другим

словам, помещенным в словарь системы. Поэтому мы не рекомендуем использовать сочетания букв 'PRON', 'PROFF', 'Z' и символ ';' в качестве имен, описываемых вами слов. Нарушение этого правила часто приводит к путанице.

 

4. ВЫЧИСЛЕНИЯ.

4.1 Вероятно, одним из первых, что вы освоили в бейсик-системе, стало использование компьютера в качестве калькулятора. Наверное, первое, что вы набрали, было что-то вроде:

PRINT 2+3*4/5

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

Попробуем освоить эти правила применительно к языку форт.

4.2 Если вы внимательно прочитали главу 1, то вам, вероятно, уже известно, что форт использует в своей работе польскую обратную запись. ПОЗ всегда считалась очень трудной для понимания, на самом же деле все не так уж сложно. ПОЗ основана на принципе: сначала описываются числа и только потом операции над ними. Под операциями здесь понимаются некоторые математические действия: +,-,*,/, возведение в степень (стрелка вверх), SIN и т.д.

В большинстве обычных калькуляторов для получения суммы чисел 2 и 3 последовательно вводят '2','+','3','=' (или ENTER). В ПОЗ-калькуляторе все выглядит несколько иначе: '2','3','+' и только потом '=' (или ENTER). Если подумать, то последняя форма записи выглядит более логичной и имитирует ход наших мыслей при сложении двух чисел. Здесь не надо помнить, что первое — это '2', не надо выполнять некоторое магическое сложение неизвестно с чем, не надо только после этого представлять, что второе слагаемое — это '3'. При сложении в уме вы всегда мысленно представляете сначала первое число, затем второе и после этого выполняете операцию суммирования. Этот алгоритм точно отображает порядок обработки чисел в ПОЗ.

4.3 Рассмотрим работу FP50 при выполнении некоторых вычислений, таких как:

* * * >2   3   +    .    ;

В результате выполнения этой команды, реализующей операцию (2+3), результат 5 будет выведен на экран дисплея. Следует напомнить, что если стек до выполнения вычислений содержал 0 элементов, то после выполнения вычислений и вывода результата их количество останется равным 0. Из приведенного выше необходимо уяснить последовательность действий, выполняемых компьютером:

2 (I) — запись в вершину стека числа 2 (TOS=2),

3 (2) — записав вершину стека числа 3 (TOS-3, 20S=2),

+ (3) — выборка из стека числа 3, затем числа 2, их суммирование и запись суммы в вершину стека (TOS”5 — единственный элемент стека),

. (4) — извлечение из стека числа 5 и вывод его на экран (стек пуст).

Данный пример показывает, что после выполнения операции над числами стека его длина стала равной 0, так как результат вычисления, помещенный на третьем шаге выполнения команды Л TOS, извлечен из стека для вывода на экран. Если бы в команде ***>2 3+ . ; отсутствовала точка, то после ее выполнения состояние стека описывалось следующим образом: TOS=5.

4.4 Рассмотрим порядок выполнения арифметических операций с числами, занесенными в стек заблаговременно. . Введите команду:

”••>7 6 5 4 3 2 1 ;— запись в стек семи чисел, TOS=l теперь выполните команду:

*** > + + + + + + .  ;

на экране отобразится только результат суммирования — число 28, а число элементов стека станет равным 0.

Первым '+'осуществит выборку TOS (=1), 20S (=2), произведет их суммирование, удалит из стека 1 и 2, а TOS примет значение их суммы, равное 3. Следующий '+' осуществит выборку TOS (=3) и 20S (=3), произведет их суммирование, удалит из стека числа 3 и 3, TOS примет значение их суммы, равное 6, и тд. Таким образом, при выполнении операции сложения из стека будут удаляться два числа, а возвращаться в стек только одно число — их сумма. Описанные действия можно представить следующим образом:

1+2=3, 3+3=6, 6+4=10, 10+5=15, 15+6^21. 21+7=28

В этом примере порядок выполнения операций сложения в общем-то не важен. Однако рассмотрение его велось с целью более глубокого понимания последовательности обработки элементов стека.

4.5 Естественно, сложение (+) — не единственная математическая операция, поддерживаемая FP50. Полный перечень математических операций (их условные обозначения и ряд других команд) приведен в приложениях 1 и 2.

Ниже приведено несколько примеров использования РР50 в режиме калькулятора. Если какая-либо операция покажется вам непонятной, то обратитесь к приложению 1. Каждому примеру, кроме того, поставлен в соответствие эквивалент бейсик-команды.

•••>7 —5 + . ; ———————>PRINT 7+(-5) т.е. 2

***>7 15 — . ; ————————•>PRINT 7-15 т.е.-8

•••>—11 60 * . ; ——————>PRINT (-11)*60 т.е.-660

***>80 7 '/ . ; ————-> PRINT 80/7 т.е. 11.42

***>2   5    * *    .    ;    ————————— >PRINT 2**5 т.е. 32

Примечание: Здесь и далее по техническим причинам "**" соответствует клавише стрелка вверх.

•**>1.8 COSR . ; ———————> PRINT COS 1.8 т.е. 0.23

•**>2 SQR . ; —————> PRINT SQR 2 т.е. 1.41

••*>-2.9 INT . ; —————-> PRINT INT(-2.9) т.е. -3

•**>-2.9 ABS . ; ——————> PRINT ABS(-2.9) т.е. 2.9

•”*>0.38 LN . ; ————————-> PRINT LNl.0.38) т.е. 0.97

•**>20 EXP . ; —————> PRINT EXP(20) т.е. 4.85E+8

•••>!   ATNR  .  ;   ————————->   PRINT ATN(l) т.е. 0.785

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

Попробуйте предсказать результат выполнения команды до ввода ее в компьютер:

•** 5 20 4 * /  .  ;

В данном примере умножение (*) будет предшествовать делению (/). Таким образом, 20S (-20) будет умножено на TOS

(=4), 20 и 4 будут удалены из стека, а TOS примет значение 80. 20S станет равным 5. На следующем шаге будет выполнено деление 20S (=5) на TOS (-80), числа 5 и 80 будут выведены из стека, а результат 0.0625 займет место TOS. И наконец, TOS будет выбрано для вывода на экран, а стек будет пуст. .

Теперь самостоятельно порассуждайте над последовательностью выполнения операций в команде:

***> 7 5 40 - /    .    ;

и убедитесь, что правильный ответ равен -0.2, т.е. 7/(5-40).

Допустим, что надо описать на форте выражение (2+3) *7. Заключенное в скобки сложение должно быть выполнено первым. Это действие может быть реализовано записью 2 3+.; если это было бы единственной нашей задачей, то TOS приняло бы значение, равное 5. Но нам необходимо кроме сложения выполнить умножение на 7, а порядок, в котором они будут сделаны, нас не интересует. Следовательно, результат выполнения команды:

***> 7 2 3 + * .  ;

будет TOS=35. Результат выполнения команды:

” • * >2   3   +   7    *    .    ;

будет тем же. Для печати TOS используйте команду ***> . ;

Давайте с помощью форта вычислим выражение

((2+3)*7)/4, дающее в ответе 35/4, т.е. 8.75. Команда:

•**4723+“/.    ;

не даст требуемого результата, т.к. после выполнения сложения (+) и умножения (*), компьютеру, по существу, останется обработать команду 4 35 / . ; , а это соответствует выражению 20S/TOS, а не наоборот. Для решения поставленной задачи необходимо набрать и выполнить команду:

*”*>723+*4/'    .    ;

результат выполнения которой соответствует выводу на экран числа 8.75. Заметьте, что запись:

2 3 + 7 * 4 /  тоже будет правильной.

В заключение осуществим вычисление выражения ((3+4) / (5-6))*8, результат которого можно представить в виде 7/<-1)*8, -7*8 или (-56). Операции с числами 3,4,5 и 6 дадут 20S-7 и TOS=-1. В нашем случае после выполнения операций сложения и вычнтания должно быть осуществлено деление, результат которого умножается на 8. Представленная ниже команда делает это очень "хитрым" способом:

***> 3 4 + 5 6 - / 8    *    .     ;

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

4.7 Знакомясь далее с FP50, вы увидите, что этот язык включает в себя систему целочисленной арифметики и с плавающей точкой. Естественно, что целочисленные операции могут быть полностью заменены операциями с плавающей точкой. Однако, целочисленная система является более быстродействующей. В главе 6 подробно рассмотрим режим использования целочисленной арифметики, а в приложении 2 приведены все ее команды.

Использование целочисленной арифметики в калькулятор-ном режиме FP50 имеет очень мало преимуществ. Если вы все же решились на этот шаг, то в командах необходимо использовать только целые числа из диапазона 0-65535, а математические операции должны записываться в виде: %+, %-, %*, %/.

ВЫВОД: При выполнении вычислений форт использует польскую обратную запись, основным правилом которой является сначала числа и только потом операторы.

 

5. ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ФОРТ

5.1 Предыдущие две главы ознакомили вас с основами FP50, ПОЗ, использованием стека и механизмом вычислений. Все, что было сказано ранее, является основой, на которой базируется материал данной главы.

5.2 Целью данной главы является пошаговое освоение вопросов программирования на языке форт, а не простое ознакомление с набором слов, размещенных в словаре системы FP50. При описании примеров часто будет делаться ссылка на приложение 1 (и приложение 2 для слов целочисленного программирования). Материал данной главы поможет вам научиться более эффективно использовать приложения в самостоятельной работе с языком. Постоянно руководствуйтесь правилом, которое рекомендует каждое вновь встреченное слово языка форт освоить с помощью приложений 1 и 2.

5.3 Ознакомление со словарем системы.

Просмотр содержимого словаря системы FP50 осуществляется после ввода в командном режиме слова 'VUST'. Реакцией Компьютера на это слово является вывод слова 'STKSWP' и сообщения:

PRESS Y TO CONTINUE

(для продолжения нажмите ' Y)

Нажатие клавиши 'Y' ведет к последовательному отображению на экране всех слов, определенных в словаре системы FP50. Здесь следует помнить, что не все слова, используемые вами в процессе программирования, являются элементами языка форт. Часть из них, такие как:

PRON, PROFF,  ;, SPACE, S, Z,

UNTIL, BEGIN

и некоторые другие являются командами операционной системы FP50 и поэтому в словаре не отображаются.

Все слова, созданные и описанные вами в процессе работы с языком форт, будут также помещены в словарь системы. Таким образом, слово 'VUST' реализует наиболее часто используемую вами функцию — просмотр словаря FP50.

5.4 Определение собственных слов.

Ранее (в разделе 2.3) отмечалось, что в процессе программирования вы можете создавать собственные слова, используемые по вашему усмотрению. К примеру, игра, описанная в разделе 8.1, содержит в себе семь новых слов, описанных в терминах исходных слов системы.

Для создания ваших собственных слов необходимо поступить , Следующим образом:

— во-первых, в командном режиме после указателя ***> на-, брать двоеточие (:) и нажать клавишу 'SPACE';

— далее необходимо набрать имя создаваемого вами слова, которое должно состоять не более чем из шести любых символов (буквы, цифры, специальные знаки) и не иметь в своем составе клавиатурных команд компьютера, таких как CHR$, TAB, LOAD и т.п.; первый символ имени должен быть буквой. Сказанное выше поможет вам избежать ошибок при наборе имен.

Для примера в качестве имени наберем слово 'TEST' и нажмем клавишу 'ENTER'. Введенное вами слово отобразится в верхней части экрана вместе с адресом его размещения в оперативной памяти (RAM). В приложении 3 приведено распределение памяти компьютера для системы FP50. При последовательном введении имени новых слов адреса их размещения будут возрастать и могут достичь максимального значения 65000, но практически это случается крайне редко. Если же это все-таки произошло, то дальнейший ввод новых слов считается невозможным, так как вы полностью заполнили участок памяти, выделенный в системе для этих целей.

После ввода имени вашего слова необходимо в терминах уже существующих в словаре слов описать закрепляемые за ним функции. Это описание может состоять как из отдельных слов, так и из их совокупности (команд). Хотя ваши знания языка форт очень малы, давайте попытаемся выполнить и эти действия. Попробуйте ввести в качестве описания слова 'TEST' следующее:

6   4   3   2   +    .     .     .    ;

и нажмите клавишу 'ENTER'. Очевидно, что в стек в этом случае будет введено 6, 4, (3+2), причем TOS-(3+2), и вслед за этим содержимое стека будет выведено на экран в соответствующей последовательности, т.е. 546, после чего стек окажется пуст.

Слово 'TEST' будет добавлено в словарь системы (проверьте с помощью 'VLIST') и всякий раз, коща оно попадется компьютеру, будет напечатано 546. Теперь вы можете с успехом использовать слово 'TEST' для описания необходимых вам слов. Это можно проверить путем ввода:

***>TEST    ;

теперь опишите слово 'TEST2':

***>: TEST2 9 . TEST 0 . ;

после ввода команды:

***>TEST2 ;

на экран будет выведено 95460.

По такому же принципу пишутся все форт-программы.

При описании слов следует руководствоваться несколькими правилами:

— каждое слово для наглядности необходимо располагать на новой строке экрана, для чего используется требуемое число пробелов, вводимое между словами. Отметим, что при работе в среде ED50 (смотри главу 7) выполнение этих действий недопустимо;

— в состав слов могут входить комментарии, заключенные в круглые скобки. Комментарии могут содержать любые символы и в процессе выполнения игнорируются. Здесь следует сказать о невозможности повторного использования имени слов для описания различных действий. В случае нарушения этого требования вам будет выдано сообщение: WORD ALREADY USED (это слово уже использовалось) При необходимости "старое" слово может быть удалено из словаря системы и компьютер забудет его название.

5.5 Удаление слов из словаря.

Удаление слов из словаря системы осуществляется путем ввода в командном режиме строчной буквы Т' (FORGET — забыть), пробела и имени слова, требующего удаления. По этой команде компьютер удаляет из словаря заданное в ней слово и "забывает" выполняемые им функции. Иногда эта операция бывает небезопасной, особенно в случаях, когда вы хотите переопределить назначение слова, уже использованного при описании других слов. FP50 не позволяет осуществлять непосредственного переименования слов и требует их удаления, удаление же слова, ранее участвовавшего в описании других слов, ведет к удалению всех слов, в которых оно являлось составной частью. Эта проблема решается путем использования редактора ED50, допускающего непосредственное переименование слов и изменение их функций (см. раздел 7.6).

Следует отметить, что исходные слова системы FP50 не имеют защиты от удаления. Поэтому с ними надо обращаться очень осторожно. Слова в словаре просматриваются с помощью слова 'VLIST' и выводятся на экран в той же последовательности, в которой осуществлялся их ввод. Поэтому удаление, к примеру, слова '?DUP', расположенного примерно в середине списка, приведет к удалению половины исходных слов языка форт (и, к несчастью, слова 'VUST'). В этом случае вам потребуется перегрузка системы FP50.

5.6 Сохранение слов.

По окончании очередного сеанса работы с языком форт у вас имеется возможность сохранения всех введенных вами слов путем создания на магнитной ленте собственной копии системы FP50. С этой целью в командном режиме необходимо набрать прописную букву 'S', нажать клавишу 'ENTER' и без промедления ввести имя файла, состоящее максимум из 9 букв и не содержащее пробелов. Программа запишется тремя блоками (перед сохранением каждого из них нажмите клавишу 'ENTER'). После завершения записи последнего блока вам необходимо выполнить сравнение эталона, хранящегося в оперативной памяти, и копии, созданной на ленте, с помощью команды бейсика 'VERIFY'. Если все в порядке, то вы будете возвращены в командный режим, если нет — необходимо выполнить команду 'BREAK', дать команду 'GOTO 2010' и повторить создание вашей копии.

5.7 Графика, определенная пользователем.

В системе FP50 имеется возможность определить 117 графических символов пользователя (UDG), 21 из которых являются символами SPECTRUM, работающего в режиме курсора 'G'. Как 21 стандартный графический символ UDG, так и остальные 96 символов его клавиатуры являются переопределяемыми. После формирования ваших графических символов и создания собственной копии системы на магнитной ленте будет сохранено только 96 символов, а оставшийся 21 переопределенный символ (блок UDG) будет потерян.

В командном режиме необходимо набрать строчную букву 'D' (DEFINE — определить) и нажать 'ENTER'. Все существующие в компьютере символы будут отображены на экране, а вам будет выдан запрос, в ответ на который нужно ввести имя символа, который требуется отредактировать. Если это действительно необходимо, то введите его с клавиатуры в режиме курсора 'G'. Вслед за этим вам следует определить содержимое восьми строк, каждая из которых состоит из восьми единиц и нулей, задающих местоположение белых и черных элементов редактируемого символа. После этого вы будете возвращены в командный режим. Не забывайте, что графические символы можно распечатать на принтере (см. раздел 3.11).

Следует отметить, что ошибки при редактировании графических символов могут привести к возврату в среду бейсика. Для перехода в командный режим системы форт необходимо выполнить команду 'GOTO 4'.

5.8 Арифметические операции и слова. Достаточно полное описание этих слов дано в приложении 1.

+, - , * , / , СТРЕЛКА ВВЕРХ, 1+, 1 - , 2+,   2— , NEGATE, ABS, SGN. INT, SQR, RND,

SINR, COSR, TANT, ASNR, ACSR, ATNR, LN, EXP

С большинством из них вы уже знакомы по главе 3.

5.9 Логические операции и слова.

Достаточно полное описание этих слов дано в приложении 1.

>, <, =, >=, <==, о, 0>, 0<. 0=,

MAX, MIN, AND, OR^ NOT.

 Символ '<>' следует набирать последовательно из '<' и '>'. Следует отметить, что в операциях сравнения >, <, =, >=, <=,<> в качестве первого операнда всегда берется 20S, а в качестве второго — TOS. Во время выполнения операций сравнения из стека убираются оба операнда. Они заменяются результатом '0' - если утверждение ложно, и' 1' — если оно верно. Это полезно знать при использовании слов 'IF', 'WHILE', 'UNTIL'.

Операции сравнения с нулем, например '0<', набираются без оробела. Так, если TOS-5, то команда '0< . ;' будет печатать О (ложь), потому что 5 не меньше 0.

'AND', 'OR', 'NOT' очень похожи на свои аналоги в языке бейсик.

5.10 Слова стековых преобразований.

Достаточно полное описание этих слов дано в приложении 1.

DROP, DUP, -?DUP. DEPTH, SWAP,

OVER, PICK, ROT, ROLL.

Эти слова позволяют более эффективно манипулировать содержимым стека.

5.11 Переменные.

В форте допустимо использование 23 переменных. В исходном состоянии системы этим переменным присвоены имена:

А, В, С,   .... X, Y, Z Исключая I, J, К, все слова переменных являются словами. Проверить это можно при помощи 'VLIST'. Следовательно, в процессе работы вы можете переименовать любую из них так, чтобы имя соответствовало ее назначению. Например, для перенаименования переменной 'В' в 'SCORE' необходимо выполнить команду:

SCORE   В    ;

Присвоение переменной числового значения осуществляется с помощью символа '!' (восклицательный знак), который читается как 'сохранить'. Например, для того, чтобы переменной 'Z' присвоить значение (-43), следует записать:

-43   Z    !    ;

Отметим, что в отличие от бейсика, в форте не требуется объявления переменных. Все переменные инициализируются при запуске системы, после чего им присваивается значение 0. Как было отмечено ранее, буквы I, J, К не являются переменными, они не используются для управления циклами (см. раздел 5.11).

Для пересылки значения переменной в стек используется команда '@', которая читается как 'FETCH' (присвоить). Следовательно, для присвоения TOS значения переменной 'Е' необходимо записать:

Е   ©   ;

а если, кроме того, требуется печать, то

Е   ©   .    ;

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

Е   ?    ;

Как и в любом калькуляторе, в форте имеется команда, обозначающая приращения — это '+!' (без пробела между символами) . Таким образом, для увеличения значения переменной 'Q'

на 253 введите:

253 Q +! ;

5.12 Константы.

Константами называют слова, отображающие значения чисел, помещаемых в стек. Для определения слова 'РГ, имеющего значение 3.141592654, введите:

:Р1    3.1415926    ;

Несмотря на то что между константами и переменными существует определенное сходство, следует отметить, что число вводимых вами констант не ограничено. Кроме того, с константами не будут работать слова (+!, ?, @), предназначенные для обработки переменных.

5.13 Организация циклов.

Так же как в бейсике, где для организации циклов используется 'FOR ... ТО ... NEXT', в форте для этих целей служат слова'DO ...ШОР'. 'DO'берет TOS в качестве первого значения переменной, управляющей циклом, a 20S — в качестве первого "незаконного" значения этой переменной (а не последнего "законного", как в бейсике). Следовательно, запись '101 1 DO ;' будет соответствовать команде бейсика 'FOR N”l TO 100'. Вместо 'NEXT' в FP50 используется слово 'ШОР', не требующее задания каких-либо операндов. Например, команда:

50   1   DO   I    .    LOOP    ;

будет печатать число от 1 до 49 (без пробелов между ними).

Слово 'Г (индекс), расположенное после 'DO', помещает текущее значение переменной, управляющей циклом, в вершину стека. Только этот вид цикла может быть вложен в любой другой, и тогда 'Г будет помещать в стек текущее значение переменной, управляющей внутренним циклом. Найдите в приложении 1 слово 'EMIT' и затем введите:

256  32  DO  I  EMIT  LOOP ;

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

До сих пор мы имели дело только с шагом изменения значения индекса цикла, равным 1. Если же шаг отличен от 1, то используются слова '+ШОР' и '-LOOP'. Они позволяют увеличить или уменьшить 'Г (индекс или переменную цикла) от значения TOS с шагом, отличным от единицы. В этом случае TOS должно быть положительным. Попробуйте выполнить команды:

51   0   DO   I    .    CR   5   +LOOP    ;

1000   1   DO   I    .    FIELD   I   +LOOP    ;

0.1   0.9   DO   I    .    0.1   -LOOP    ;

31 127 DO I EMIT 1 -LOOP ;

Для освоения незнакомых слов следует обратиться к приложению 1. В приведенных примерах шагами циклов являются 5, К!!!), -0.1 и -1, соответственно.

Слова 'DO' и 'LOОР' должны следовать парами, и (по аналогии с бейсиком) пересекающиеся невложенные циклы строго запрещены. Использование вложенных циклов поддерживается наличием трех специальных индексов:

I — индекс самого внутреннего цикла;

J — индекс цикла, второго по отношению к самому внутреннему;

К — индекс цикла, третьего по отношению к самому внутреннему.

Имена этих индексов не должны изменяться, так как их использование скрыто от вас в самих процедурах организации циклов, написанных в машинных кодах. Кроме того, с ними нельзя обращаться, как с обычными переменными, описанными • разделе 5.11; попробуйте выполнить команду:

8    1   DO   8    1   DO    I    J    •    .    SPACE LOOP   CR   LOOP    ;

Слово 'LEAVE* присваивает индексу самого внутреннего цикла значение ограничителя циклов — здесь это значение является первым незаконным. После использования слова 'LEAVE' в теме цикла выполнение его операций будет продолжаться до слова 'LOOP', ограничивающего данный цикл. Используется для принудительного завершения цикла.

Слово 'EXITLP' заставляет компьютер отказаться от выполнения текущей команды и может использоваться только внутри цикла.

Следует отметить достаточно высокое быстродействие циклов, имеющих целочисленные индексы.

В форте существует несколько циклов, отличных от 'DO ... LOOP'. Ими являются циклы, описанные с помощью слов 'BEGIN', 'UNTIL', которые постоянно выполняются до тех пор, пока 'UNTIL' не обнаружит в TOS значение "истинно". Введите, к примеру:

BEGIN 127 EMIT INKEY 13 = UNTIL ;

эта команда будет выводить значение CHR$(127) (т.е. '@') до тех пор, пока вы не введете символ клавиатуры с кодом 13 (т.е. клавиша 'ENTER'). Здесь слово '”5' поместит в стек 1 только тогда, когда слово 'INKEY' возвратит число 13, а единица в TOS — это то, чего ожидает 'UNTIL'. Заметим, что любое число в вершине стека, не равное 0, считается "истиной". Разновидность описанного выше является запись 'BEGIN ... WHILE ... REPEAT'. Действия, описанные между 'BEGIN' и 'REPEAT', выполняются непрерывно до тех пор, пока 'WHILE' не обнаружит в TOS значение "истина" (т.е. 1).

Как только в TOS будет помещено значение "ложь" (0), управление будет передано слову, следующему за 'REPEAT'. Введите и выполните команду:

8129 BEGIN DUP 1 > WHILE DUP . FIELD 2 / REPEAT DROP ;

в данном случае деление числа 8192 на 2 будет продолжаться до тех пор, пока результат не будет меньше 1. Следовательно, последним напечатанным числом будет 2, а не 1.

5.14 Слова, обеспечивающие ветвления.

В форте существует конструкция:

IF ... ELSE . . . THEN',

выполняющая функции, аналогичные командам бейсика 'IF ... THEN'. Здесь постоянно отслеживается наличие в стеке значения "ложь" или "истина" для условия, которому предшествует слово 'IF'. Между 'IF' и 'ELSE' вписываются операции, которые должны выполняться до тех пор, пока в TOS находится значение 'ИСТИНА'. Между 'ELSE' и 'THEN' располагаются слова, которые выполняются при Т08='ложь'. Как только компьютер выполнит полностью одну из описанных выше последовательностей слов, управление будет передано слову, следующему за 'THEN'. Для примера выполните:

5   5    IF   444    .    ELSE   333    .    THEN    ;

Следует отметить, что в данной .[конструкции 'IF', 'ELSE' и 'THEN' используются только вместе.

Как и для 'UNTIL' (см. раздел 5.13), все значения TOS, не равные 0, воспринимаются как 'истина'.

5.15 Звуки.

Подробно слова 'ВЕЕР' и 'BLEEP' описаны в приложении 1. Оба эти слова воспринимают значение 20S как длительность, а TOS — как высота тона. Выполните команды:

13   0  DO 0.25 I BEEP LOOP ;

200  0  %DO 10 %1 BLEEP %LOOP ;

Символ % свидетельствует об использовании целочисленных операций, которые более быстродействующие, чем операции с плавающей точкой. Более подробно это описано в главе 6.

5.16 Управление печатью.

Более подробно представленные ниже слова описаны в приложении 1.

SPACE, SPACES, EMIT, ..., FIELD, CR, CLS, AT, TAB Вспомним, что для печати без пробелов используется точка (.).

5.17 Управление цветом.

Представленные ниже слова описаны в приложении 1.

INK, PAPER, FLASH, BRIGHT. INBERS,

BORDER, PROVER, ATTR.

Слово 'PROVER' аналогично команде бейсика 'OVER'. Префикс 'PR' используется для того, чтобы отличить данное слово от 'OVER', осуществляющего манипулирование стеком.

5.18 Графика.

Подробно слова управления графикой даны в приложении 1. PLOT< CIRCLE< DROW< POINT> Все эти слова, кроме 'POINT', используют цвета, установ-ленные словами, описанными в разделе 5.17.

5.19 Ввод.

Все приведенные ниже слова описаны в приложении 1.

INKEY, KEY, QUERY. WORD, PAD.

>IN, WAIT. Целесообразно сравнить возможности слов 'INKEY', 'KEY'

и 'QUERY'.

5.20 Выход.

Приведенные ниже слова описаны в приложении 1.

EXIT., QUEIT, ABORT.

5.21 Выводы.

В предыдущих разделах мы познакомились с назначением основных слов языка форт. Полный список слов языка приведен в приложении 1. Умышленно в данном разделе не упоминалось о ряде слов, отображаемых в команде 'VUST', например, таких как 'STKSWP'. Эти слова вам понадобятся только тоща, когда будет успешно освоено программирование с помощью простых конструкций языка форт, описанных выше. Только после этого вам следует обратиться к разделу 8.2 и повышать свое мастерство дальше.

Теперь у вас достаточно знаний для того, чтобы самому создавать удивительные форт-программы. Если же этот процесс кажется еще достаточно сложным, то для примера разберитесь с работой подпрограммы раздела 5.15, формирующей превосходную звуковую заставку (ZAP).

Естественно, что в ряде случаев у вас может возникнуть вопрос: почему в системе заранее не определено такое полезное слово, как 'ZAP'? Хитрость состоит в том, что слова, созданные вами лично, в большей степени будут отвечать вашим требованиям.

Давайте попробуем определить слово 'RNDO' (или с любым именем, которое вам нравится), которое будет вырабатывать случайную последовательность целых чисел в интервале от 1 до значения, помещенного в TOS:

: RNDO RND * INT 1 %+ ;

после создания слова необходимо выполнить, например:

5   RND()    ;

пусть слово 'RND' выдаст число 0.613. В этом случае

INT(5*0.613)+1=4

и число 4 будет помещено в TOS. Здесь диапазон чисел был первоначально задан от 1 до 5. Теперь определим слово 'LOG', осуществляющее вычисление значения логарифма по основанию 10.

:    LOG   LN   10   LN   /    ;

так как LOG(X)=LN(X)/LN(10). Или нарисуем две оси координат:

: AXES  CLS  0  0  PLOT  0  175  DRAW  0  88  PLOT  255  0  DRAW ;

теперь при встрече со словом 'AXES' компьютер будет рисовать на экране ваши оси.

Давайте определим слово 'CURVE', которое будет рисовать синусоиду значения, размещенного в TOS:

: CURVE 256 0 %DO %1 88 PLOT 0 %1 256 /360 * SIND 3 PICK * DRAW %LODP DROP ;

и посмотрим, что выполнит команда;

30   CURVE

затем путем комбинации слов 'CURVE' и 'AXES' определим новое слово 'WAVE':

: WAVE AXES 80 CURVE WAIT ;

если вам хочется для выхода из бесконечно длительного цикла использовать клавишу 'BREAK', то вы можете определить слово BREAK?'

: BREAK? INKEY 32 %= IF ABORT ELSE THEN ;

И ввести его в любой достаточно длительный цикл.

Если все сказанное выше еще не убедило вас в необходимости освоения языка форт, то сначала определите слово 'STRIPES':

:    STRIPES    16384   6144   51    FILL    ;

затем выполните его и посмотрите, как долго это же самое будет делать бенсик.

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

Для освоения принципов работы игры, приведенной в разделе 1.1, используйте редактор системы, описанной в главе 7.

 




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
One more boring text from Yerzmyey
Введение - Что самое интересное, не поверите - данный номер пишется уже после того, как сделан NEXT #01.
News - Новости нашего городка.
Parties?! - FunTop'99 vs Chaos Construction'99: Точка зрения.
События - демопати Millennium Party.

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