Перечислять операторы и функции языка программирования – занятие скучное.
Форт позволяет начать создание программы сразу, продвигаясь шаг за шагом и на практике исследуя открывающиеся
возможности.
Мы напишем интересную, полезную программу. Начнем с самого простого, постепенно усложняя исходный текст и постигая тонкости программирования в AFS.
Для практического повторения приводимых далее примеров подойдет любая Форт-машина семейства AFM. Для начинающих рекомендуем недорогой комплект "Старт AFM-0", который можно приобрести в нашем онлайн магазине DT Store.
Какие ресурсы Форт-машины можно использовать для создания практически полезной программы, если мы не хотим с первых шагов углубляться в программирование устройств ввода-вывода?
Каждая AFS имеет текстовую консоль для связи с оператором. На физическом уровне консоль использует порт терминала Форт-машины. Эти средства доступны всегда и во всех моделях Форт-машин семейства AFM.
Вы начинаете пользоваться текстовой консолью AFS сразу после включения системы – вы нажимаете клавишу Enter, на терминал выводится Ok.
В предыдущей статье мы привели пример вывода текстовой строки с помощью слова ." . Рассмотрим еще одно слово для вывода текста. Наберите
65 EMIT
и нажмите Enter.
На экране терминала появится символ A и стандартное сообщение Ok:
Слово EMIT берет число с вершины стека и выводит его в системную текстовую консоль (на терминал) без каких-либо изменений, в двоичном виде. Дело в том, что десятичное число 65 – это код символа A на экране. Для всех символов, выводимых на экран в текстовом режиме, определены стандартные коды.
Коды символам присваивались еще до появления компьютеров, во времена первых телеграфов. Коды первых 128 символов зафиксированы Американским Стандартом Кодов Информационного Обмена (ASCII) и используются во всех современных электронных устройствах.
Вот таблица кодов ASCII:
В столбце "Код" указано десятичное, а в столбце "HEX" – шестнадцатеричное значение кода. Соответствующее этому коду изображение, выводимое на экран, приведено в столбце "Символ". О шестнадцатеричной системе счисления мы поговорим в одной из следующих статей.
Вы можете поэкспериментировать со словом EMIT , передавая ему в стеке различные коды ASCII.
Изображение символов с кодами более 127 зависит от настроек терминала. Обычно это символы восточноевропейских алфавитов, кириллицы, знаки псевдографики, математические символы.
Слово EMIT передает в консоль только младший байт числа из стека, поэтому после кода 255 символы начнут повторяться. (Байт состоит из 8 битов, поэтому 255 – максимальное десятичное значение, которое он может содержать).
Вероятно, вы уже заметили, что таблица ASCII начинается с кода 32 (пробел). Но явно есть и коды от 0 до 31. Возможно, вы уже попытались вывести эти коды на терминал. Если ваш терминал "сошел с ума" после этих экспериментов, перезагрузите его.
Что же не так с символами от 0 до 31? Эти коды используются для управления терминальными устройствами – принтерами, дисплеями, клавиатурами, телетайпами и т.п.
Когда вы нажимаете клавишу Enter, терминал передает в удаленное устройство код 13 – перевод курсора в начало строки. Удаленное устройство посылает в терминал код 13 и за ним код 10 – перевод строки. Вы видите, что курсор перескочил в начало следующей строки.
Попробуйте ввести
7 EMIT
Ваш терминал издаст короткий звуковой сигнал.
Когда начала развиваться вычислительная техника и появились видеотерминалы, связанные с большими ЭВМ, кодов управления, унаследованных от телеграфной техники, стало не хватать.
Вместо одного символа стали использовать последовательности символов, которые терминалы воспринимают как управляющие команды. Для обеспечения совместимости был разработан стандартный набор таких команд, утвержденный Американским Национальным Институтом Стандартов (ANSI).
Команды ANSI начинаются с управляющего символа с кодом 27 (Escape), за которым следуют один или несколько символов ASCII. Такие команды часто называют Escape-последовательности.
Попробуем воспроизвести некоторые из них. Введите
27 EMIT 91 EMIT 50 EMIT 74 EMIT
Экран терминала очистится, как только вы нажмете Enter.
С помощью таблицы кодов можно расшифровать, что мы вывели на терминал последовательность символов {Escape}[2J . Это команда ANSI для очистки экрана.
Искать коды символов по таблице неудобно, поэтому мы не будем больше этого делать.
Если вы хотите узнать, какой код имеет символ, используйте слово CHAR. Оно принимает следующее за ним в потоке ввода слово, ограниченное пробелами, определяет код первого символа и помещает его на вершину стека.
Проведем эксперимент. Введите CHAR Q . и нажмите Enter. Система выдаст код символа Q:
Управляющий символ с кодом 27 мы будем часто использовать в дальнейшем. Создадим для него константу с помощью слова CONSTANT :
27 CONSTANT ESC
Теперь у нас есть слово ESC , которое помещает в стек число 27 при выполнении. Константы в Форте используются постоянно. Кроме наглядности, они сокращают объем кода и ускоряют его выполнение.
Еще немного оптимизируем наш код. Комбинация символов Escape и [ используется в начале большинства ANSI команд. Создадим специальное слово, выводящее эту пару символов в текстовую консоль:
: ESC[ ESC EMIT [CHAR] [ EMIT ;
Теперь можно меньше печатать руками – у нас есть слово ESC[ .
Обратите внимание, мы использовали слово [CHAR] . Это специальный вариант слова CHAR для использования внутри определения нового слова. Оно так же определяет код первого символа следующего слова, но не передает его в стек, а сохраняет в определении нового слова. Когда это слово будет выполняться, код символа будет помещен в стек, откуда его достанет EMIT.
Создадим слово для очистки экрана терминала (CLEar SCReen):
: CLRSCR ESC[ ." 2J" ;
Здесь вместо EMIT для каждого символа мы использовали вывод строки с помощью ." .
Наберите CLRSCR – экран очистится.
Было бы неплохо после очистки перемещать курсор в верхний левый угол. Для этого также найдется команда ANSI.
Она представляет собой последовательность {Escape}[строка;столбецH , где "строка" и "столбец" – текстовые значения координат курсора на экране. Верхний левый угол экрана имеет координаты 1;1 .
Вы можете создать слово для перемещения курсора "домой" (CuRSor HOME):
: CRSHOME ESC[ ." 1;1H" ;
Использование этой команды ANSI значительно расширяет возможности управления выводом на терминал. Об этом мы поговорим в следующей статье.
Спасибо за внимание.