ß             Основные характеристики языка программирования FORTH

Редакторы языка, версии языка, установка и компиляция программ

 

Адрес документа:

http://90.189.213.191:4422/temp/gr_mi38_37_mp5_sh/gr_mi38_37_mp5_sh.doc     инд 2-95-л5

 

В данной лекции рассматривается  язык программирования forth. История создания. Версии. Особенности. Установка и компиляция программ.  

Содержание:

 

Краткий исторический обзор о языках программирования

В начале появились универсальные языки программирования.

·         Фортран

В 1954 году в недрах корпорации IBM группой разработчиков во главе с Джоном Бэкусом (John Backus) был создан язык программирования Fortran. Значение этого события трудно переоценить. Это первый язык программирования высокого уровня. Впервые программист мог по-настоящему абстрагироваться от особенностей машинной архитектуры. Ключевой идеей, отличающей новый язык от ассемблера, была концепция подпрограмм. Напомним, что это современные компьютеры поддерживают подпрограммы на аппаратном уровне, предоставляя соответствующие команды и структуры данных (стек) прямо на уровне ассемблера, в 1954 же году это было совершенно не так. Поэтому компиляция Fortran’а была процессом отнюдь не тривиальным. Кроме того, синтаксическая структура языка была достаточно сложна для машинной обработки в первую очередь из-за того, что пробелы как синтаксические единицы вообще не использовались. Это порождало массу возможностей для скрытых ошибок, таких, например:

В Фортране следующая конструкция описывает «цикл for до метки 10 при изменении индекса от 1 до 100»: DO 10 I=1,100 Если же здесь заменить запятую на точку, то получится оператор присваивания: DO10I = 1.100 Говорят, что такая ошибка заставила ракету взорваться во время старта!

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

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

·         Cobol

В 1960 году был создан язык программирования Cobol. Он задумывался как язык для создания коммерческих приложений, и он стал таковым. На Коболе написаны тысячи прикладных коммерческих систем. Отличительной особенностью языка является возможность эффективной работы с большими массивами данных, что характерно именно коммерческих приложений. Популярность Кобола столь высока, что даже сейчас, при всех его недостатках (по структуре и замыслу Кобол во многом напоминает Фортран) появляются новые его диалекты и реализации. Так недавно появилась реализация Кобола, совместимая с Microsoft .NET, что потребовало, вероятно, внесения в язык некоторых черт объектно-ориентированного языка.

·         PL/1

В 1964 году все та же корпорация IBM создала язык PL/1, который был призван заменить Cobol и Fortran в большинстве приложений. Язык обладал исключительным богатством синтаксических конструкций. В нем впервые появилась обработка исключительных ситуаций и поддержка параллелизма. Надо заметить, что синтаксическая структура языка была крайне сложной. Пробелы уже использовались как синтаксические разделители, но ключевые слова не были зарезервированы.

В частности, следующая строка — это вполне нормальный оператор на PL/1: IF ELSE=THEN THEN THEN; ELSE ELSE

В cилу таких особенностей разработка компилятора для PL/1 была исключительно сложным делом. Язык так и не стал популярен вне мира IBM.

·         BASIC

В 1963 году в Дартмурском колледже (Dartmouth College) был создан язык программирования BASIC (Beginners’ All-Purpose Symbolic Instruction Code — многоцелевой язык символических инструкций для начинающих). Язык задумывался в первую очередь как средство обучения и как первый изучаемый язык программирования. Он предполагался легко интерпретируемым и компилируемым. Надо сказать, что BASIC действительно стал языком, на котором учатся программировать (по крайней мере, так было еще несколько лет назад; сейчас эта роль отходит к Pascal). Было создано несколько мощных реализаций BASIC, поддерживающих самые современные концепции программирования (ярчайший пример — Microsoft Visual Basic).

·         Algol

В 1960 году командой во главе с Петером Науром (Peter Naur) был создан язык программирования Algol. Этот язык дал начало целому семейству Алгол-подобных языков (важнейший представитель — Pascal). В 1968 году появилась новая версия языка. Она не нашла столь широкого практического применения, как первая версия, но была весьма популярна в кругах теоретиков. Язык был достаточно интересен, так как обладал многими уникальными на так момент характеристиками.

 

Версии forth

 

  1. FORTH  -  написание  названия языка в английском языке.

 

Язык программирования Форт был разработан Чарльзом Муром в 1960..1970 гг. Первоначально язык назывался FOURTH, однако на ЭВМ, на которой он работал, символьные имена могли иметь  только пять букв. Так язык стал называться FORTH. Несмотря на конкуренцию других языков программирования, в частности языка Си, Форт мало-помалу сал завоевывать популярность, особенно при решении задач управления сложными объектами в реальном времени. Характерные черты языка Форт:

стек - единственная структура данных;

основной тип данных - целый;

простой синтаксис и компактная запись;

малая потребность в ресурсах;

быстрая интерпретация на основе машинного кода;

отсутствие контроля за переменными.

 

    Язык  Форт использовался для математического  обеспечения корабля многоразового использования типа Шаттл, спутников Земли, для разработки телеигр, при создании мультфильмов Stars Wars и т.д. В 1976г. Комитет международного астрономического союза принял Форт в качестве стандартного языка программирования. Позднее Форт применялся для создания экспертных систем, систем искусственного зрения, автоматизации анализа крови и кардиологического контроля.    В США создано  общество пользователей Форта  (FIG, FORTH Interesting Group). В РФ на настоящий момент существует большое сообщество пользователей языка.

 

 

  1. Форт  - написание названия языка в русском языке.

По словам Ч. Мура, основной целью создания нового языка было повышение собственной производительности. Он пишет: "Традиционные языки программирования не обеспечивали желаемой для меня мощности, легкости и гибкости. Я подсчитал, что за 40 лет очень хороший программист может написать 40 программ, а мне хотелось гораздо больше. В мире столько вещей, которые нужно сделать, что мне требовался инструмент, способный помочь в этом" (по словам Мура, в своем окончательном виде язык повысил его производительность в 10 раз).

 

Первым применением языка ФОРТ стала созданная в 1971 году Муром программа для Национальной радиоастрономической обсерватории в г. Китт-Пик, шт. Аризона, которая в реальном масштабе времени управляла системой наведения 11-метрового телескопа. Затем им был разработан первый компилятор, заменивший используемый для этого кросс-ассемблер.

 

В 1973 году Ч. Мур, Э. Разер и Н. Конклин основали фирму Forth Inc., которая тиражировала системы, пригодные не только для обсерваторий, но и для других специальных применений. В середине 70-х годов фирма представляла язык ФОРТ на гибких магнитных дисках для реализации на микропроцессорах Intel 8080, 8086, Z80, LSI-11, Motorola 6800, TI 9900, а также для мини-ЭВМ PDP-11 фирмы DEC, Nova и Eclipse фирмы Data General и др.

 

Что же такое ФОРТ? "ФОРТ - необычный язык. Он "попирает" многие устоявшиеся правила программирования" - начинает свою книгу по ФОРТу Л. Броуди.

 Основным понятием ФОРТа является слово, под которым понимается любая последовательность символов (включая и знаки препинания), отличных от пробелов.

 Язык имеет простой синтаксис.

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

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

 

Из характерных особенностей языка ФОРТ выделяют следующие:

 

·         наличие стека данных, применяемого для обмена аргументами и отдельными словами-функциями;

возможность работы с объектами типа "словарь", описывающими активный в данный момент список слов, известный системе;

·         динамическое (в момент использования) переключение режимов "интерпретация-компиляция", которое позволяет реализовать сложные структуры памяти и управления;

·          наличие двух уровней расширения языка с помощью так называемых определяющих слов и с помощью специального слова ":" (двоеточие);

·         встроенный в ФОРТ язык Ассемблер позволяет эффективно реализовывать аппаратно зависимые функции сопряжения с другими системами программирования.

·          

К  трудности обучению  языку относят:

  • необычность выражений и отсутствие арифметики с плавающей точкой;
  • отсутствие типов;
  • трудность чтения текстов программ;
  • трудности перевода программ на другие языки;
  • использование польской записи и необычной формы предложения IF...ELSE...THEN.

 

Появление ФОРТа, как отмечают некоторые ученые, в частности А. Вулф, было воспринято профессионалами неоднозначно. Одни высказывали сомнение, а язык ли это вообще и если язык, то низкого или высокого уровня; вторые считали ФОРТ вехой в развитии языков программирования; третьи - шагом в сторону. Достойное место среди языков программирования он занял после ряда успешных реализаций на мини- и микро-ЭВМ. С появлением персональных компьютеров кривая популярности ФОРТа резко подскочила вверх, и по некоторым утверждениям, вывела его к середине 80-х годов на третье место после БЕЙСИКа и ПАСКАЛя.

В 1977 году Ким Харрис из Кремниевой долины организовал группу под названием ФИГ (FORTH Interest Group), которая в следующем году создала упрощенный интерпретатор языка для персональных компьютеров под названием ФИГ-ФОРТ (FIG-FORTH), продававшийся по очень низкой цене. ФИГ-ФОРТ завоевал огромную популярность у массового пользователя.

У нас в стране система ФИГ-ФОРТ реализована на мини-ЭВМ СМ-4 с операционными системами ОС РВ и РАФОС.

Язык ФОРТ нашел применение во многих областях науки и техники, в частности при разработке трансляторов и операционных систем; для сбора и анализа данных; в системах машинной графики; при создании экспертных систем; для управления станками и роботами и т.д.

Хорошая реклама ФОРТу была сделана летом 1985 года, когда после 16 дней упорных поисков франко-американская научная экспедиция с помощью подводного аппарата "Арго" в водах Северной Атлантики на глубине более 3 км обнаружила затонувший в 1912 году океанский лайнер "Титаник". Компьютерная система, установленная на подводном аппарате и предназначенная для автоматического управления видеокамерами, работала по программе, написанной на языке ФОРТ.

В настоящее время как за рубежом, так и в нашей стране осуществлены и успешно развиваются аппаратные реализации языка ФОРТ, так называемые ФОРТ-процессоры (один из первых выпустил Ч. Мур), которые выполняют слова ФОРТа как машинные команды.

В 1983 году был выпущен стандарт на язык ФОРТ - "ФОРТ-83".

В США с 1978 года издается периодический журнал "FORTH Dimensions", предназначенный для массового пользователя. А для программистов-профессионалов с 1983 года выходит журнал "The Journal of Forth Application and Research". Начиная с конца 70-х годов проводятся ежегодные конференции, посвященные проблемам развития ФОРТ-систем.

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

Среди реализованных систем необходимо отметить следующие.

 

  • Единый ФОРТ для микропроцессоров К580, К1801, К1810 разработан сотрудниками ЛГУ и НИИСчетмаша. Система установлена на СМ-3, СМ-4, СМ-1800, ДВК, "Электроника-60", ЕС-1840, "Корвет" и др.
  •  Система ФОРТ-ЕС разработана С.Н. Барановым в ЛИИАНе для ЕС ЭВМ и работает под управлением операционных систем ОС ЕС и СВМ ЕС.
  • Система Астро-ФОРТ разработана сотрудниками ИТА АН СССР и ЛИИАН для ПЭВМ ЕС 1840.
  • Система ФОРТ "Искра-226" создана в Институте социально-экономических проблем АН СССР.
  • Система ФОРТ-М6000 разработана ленинградцем В.Н. Патрышевым для ЭВМ М6000, она ориентирована на стандарт "ФОРТ-83".
  • Система ФОРТ-БЭСМ-6, созданная И.Р.Агамирзяном (ИТА АН СССР и ЛИИАН) для ЭВМ БЭСМ-6, работает под управлением операционной системы ДИСПАК.
  • Система ФОРТ-Эльбрус, разработанная в ЛГУ А.Е. Соловьевым для МВК "эльбрус", работающая под управлением ОС "Эльбрус".
  • Система ФОРТ-Тарту, созданная сотрудниками ВЦ Тартуского государственного университета, работает под управлением ОС РВ и UNIX.

При комиссии по технологии программирования при ГКНТ в рамках рабочей группы по технологии программирования в 1985 году была создана целевая подгруппа по языку ФОРТ, в задачи которой входило распространение опыта использования ФОРТ-систем.

В последние годы ленинградские разработчики ФОРТ-систем создали научно-производственный кооператив "ФОРТ-Инфо" для развития и распространения ФОРТ-Систем в различных областях человеческой деятельности.

Приведем в заключение одно высказывание автора языка: "ФОРТ представляет человеку удобные средства общения "умными машинами", которыми он себя окружает. Следовательно, этот язык должен обладать свойствами естественных языков, включая компактность, разносторонность и расширяемость. Я считаю его лучшим языком для написания программ, изложения алгоритмов или объяснения работы компьютера...".

 

Для кафедры ТЭ СибГУТИ язык  программирования форт в обучении программированию микропроцессорных систем был выбран по следующим причинам и ограничениям системного администратора.

  • Все компьютеры на кафедре включены в локальную сеть и имеют доступ к интернету. Студенты всегда имеют возможность посмотреть и получить информацию из мировой сети, передать и получить электронную почту.
  • Для студента выделено памяти для работы на ПК всего 10 гб. В этой области свободного места остается не более 30%.
  • Студенты на ПК кафедры имеют статус =Гостя=, и поэтому  установка программ им запрещена.  
  • Основные инструменты  «блокнот», «проводник».

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

Установка версии spf4

Написание версий форт sp-f  начато Андреем Черезовым в 1992.  Сейчас существует уже 4-ая версия spf4

В архиве две версии компилятора

- spf4.exe – оригинальная версия автора языка, возможна компиляция программ размером до 512 кб.

- 100_spf4.exe – версия spf4.exe модифицирована для компиляции файлов программ до 100 мб.

Развитие  компьютерных технологий часто опережает программное обеспечение. На момент 1992 года программы в 512 кб считались очень большими. Мы говорим о  исполняемых файлах формата *.exe.  Но поскольку, сейчас память в гигобайты считается нормой, то и программы так же могут быть таких размеров.

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

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

 

  • Создать каталог для работы и отладки программы;
  • Скачать и распаковать файл компиляции в созданный  каталог;
  • Создать редактором текстов или стандартным блокнотом файл с расширением *.f  Например \\test2.f в данном каталоге;
  • Обозначить в ПК  место расположения файла, как показано ниже на картинке.

 

Таким образом, при выборе мышкой   файла текста программы, произойдет его компиляция.  Подготовиться или нет исполняемый файл  - будет сообщение об ошибке.

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

Внимание!  Необходимо помнить о файловой структуре. Рекомендуется использовать подкаталоги, в которых отлаживать программы. А в «вершине» находится компилятор.

Для более удобной и наглядной работы с программами и текстом удобно пользоваться файловой оболочкой Total_Commander – версия без установки. Скачать в рабочий каталог своих програм и выполнить файл  Totalcmd.exe показан ниже на рисунке.

 

Если при выполнении  файла с расширением *.f подключается компилятор, то  установка языка программирования считается законченной.

Основные конструкции программы

Весь словарь spf можно получить если выполнить слово WORDS.  На экране выглядит так:

Чтобы получить эти данные в лог файле, необходимо предварительно набрать команду выдачи файла лога

  STARTLOG ( ВКЛЮЧИТЬ ФАЙЛ ОТЧЕТА SPF.LOG )    ENDLOG (  выключить файл отчета )

В данном компиляторе 945 СЛОВ, которые можно использовать в программировании. И даже написать свой язык программирования.  Вероятно, все возможности языка не охватить. Но требуется научиться пользоваться  лишь малой частью этого богатства. Рассмотрим кратко основные конструкции. Полное описание смотрите в прилагаемой литературе.

Переменные. Переменные для хранения числовых значений создаются с помощью слова VARIABLE:

VARIABLE  <var_name>

Определить переменную можно до начала задания,  : , а заносить и извлекать из нее значение можно внутри раздела ;. При создании переменной в нее заносится значение 0.

Значение заносится в переменную с помощью слова ! (восклицательный знак):

<var_value> <var_name> !

Пример:

\ теперь переменная my_var содержит число '12'
12 my_var !

Чтобы "извлечь" значение переменной используется слово @:

<var_name> @

Пример:

\ прибавляем '10' к значению переменной my_var ('12')

\ результат - '22'
my_var @ 10 +

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

Пример:

\ создаем две переменные

VARIABLE first_var

VARIABLE second_var

    \ заносим число '18' в переменную 'first_var'

    18 first_var !

    \ прибавляем '4' к значению переменной 'first_var'

    \ и заносим результат в переменную 'second_var'

    \ (4 + 18 = 22)

    4 first_var @ + second_var !

    \ выводим значение переменной 'second_var' на экран

   ."second_var TYPE second_var @  .

 

Создание и использование новых слов

Создание новых форт-слов очень напоминает создание переменных, только используется при этом другой синтаксис:

: <имя_слова> <тело слова> ;

Вы обратили внимание на пробелы после ':' и перед ';'  пробел - это разделитель слов. Форт воспримет имя, содержащее пробел как два разных идентификатора).

Пример:

\ создаем новое слово 'x2', которое будет удваивать

\ верхний элемент стека

: x2 2 * ;

\ теперь попробуем 'x2' в действии:

2 x2   \ теперь на стеке хранится результат умножения 2 * 2

16 x2  \ теперь на стеке хранится результат умножения 16 * 2

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

Пример:

\ если слово 'x2' уже определено, то мы можем

\ создать новое слово,  которое будет, скажем,

\ отнимать '4' от результата работы слова 'x2'.

\ назовем новое слово 'x2minus4'

: x2minus4 x2 4 - ;

\ пробуем 'x2minus4' в действии:

8 x2minus4  \ теперь на стеке хранится результат

            \ выражения '(8 * 2) - 4'

1 x2minus4  \ теперь на стеке хранится результат

            \ выражения '(1 * 2) - 4'

Новые слова создаются в начале задачи (:), а использовать их можно внутри самого раздела :.

\ создаем два новых слова

: x2 2 * ;

: x2minus4 x2 4 - ;

    \ выводим на экран результат работы '3 x2'

    ." 3 x2 = “ 3 x2 .

    \ выводим на экран результат работы '6 x2minus4'

    ." 6 x2minus4 = “  6 x2minus4  .

    \ выводим на экран результат работы '1 x2minus4'

    ." 1 x2minus4 = “  1 x2minus4 .

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

Числа двойной длины

Некоторые слова Форта возвращают числа двойной длины, т. е. число, представление которого занимает 64 бита вместо 32. Число двойной длины занимает в стеке место двух чисел одинарной длины.

Для работы со числами двойной длины в Форте есть специальные слова:

 

D.   выведение числа двойной длины на консоль

D+  сложение двух чисел двойной длины

D- вычитание одного числа двойной длины из другого (d1 - d2)

DNEGATE изменение знака числа двойной длины на противоположный

D<   занесение в стек истины, если d1 меньше d2

D= занесение в стек истины в случае равенства d1 и d2

D0= занесение в стек истины, если d равно нулю

Константы двойной длины записываются с точкой на конце. Чтобы конвертировать число одинарной длины в число двойной длины используется слово S>D. Чтобы конвертировать число двойной длины в число одинарной длины используется слово D>S.

 

Примеры:

\ складываем два числа двойной длины

1000000. 2000000. D+

\ сравниваем два числа двойной длины и выдаем сообщение

10240. 90000. D<

IF  ." < "

ELSE  ." > "

THEN

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

Примеры программ

Пример1   из лекции 4 –  формирование  звуковых сообщений на компьютере

\ начало  текста программы на языке forth - пример программирования звуков через системных динамик

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

WINAPI: MessageBeep   USER32.DLL ( пищание системного динамика )

WINAPI: Beep KERNEL32.DLL        ( ФУНКЦИЯ  т-МС  F-ГЦ -- )

: PAUSE1 ( N --> пауза в N  милисекунд 0> )  Sleep DROP  ;  (  формирование паузы )

: ZWUK (   Т-мс F-гц --- )   Beep DROP  ;

: BEEP_M2 (  цыганочка с входом  )

 [ DECIMAL ]

 100 2500   ZWUK

 100 2000   ZWUK

 100 2500   ZWUK

 100 2000   ZWUK

  [ HEX ]

  ;

: TEST  ( Выполнение пищания  в цикле 10 раз с паузой в 100 милисекунд )

 10 0 DO ( Начало цикла )

       CR   ( ОТОБРАЖЕНИЕ С НОВОЙ СТРОКИ )

       I  . (  ВЫДАЕТСЯ ЧИСЛО В ЦИКЛЕ ОТ 1 ДО 10 )

       0x40    MessageBeep  DROP  ( ВЫДАЕТСЯ ЗВУК ПИЩАЛКИ ДИНАМИКА )

       100 PAUSE1 ( задаем паузу в 100 мс )

    LOOP  ( ЦИКЛ ОКОНЧЕН )

;

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

BEGIN

    TEST ( Выполнение пищания  в цикле 10 раз с паузой в 100 миллисекунд )

CR   S"  Для выхода из программы нажать клавишу 1, для продолжения любую другую "  ANSI>OEM TYPE  ( ВОЗМОЖНО ОТОБРАЖЕНИЕ НЕПРАВИЛЬНОЕ ИЗ-ЗА КОДИРОВОК РЕДАКТОРА ПЕРЕВОД ANSI В DOS )

    KEY  [CHAR]  1 = UNTIL  ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )

    BEEP_M2 (  цыганочка с входом  -  окончание программы звук с другим формированием  )

;

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\  текст программы окончен.

 

 

Пример 2     формирование  повторения нажатий  на компьютере.

\ начало  текста

\ формирование  повторения нажатий  на компьютере.

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

     CR   S"  Для выхода из программы нажать клавишу 1, для продолжения любую другую "  ANSI>OEM TYPE 

     [CHAR]  1   (  K -- )

BEGIN

    EMIT ( выдается код нажатой клавиши )

    KEY  DUP [CHAR]  1 = UNTIL  ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )

;

 

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\  текст программы окончен.

 

 

Пример 3     формирование таблицы умножения  на компьютере.

\ начало  текста

\ формирование  таблицы умножения

: .R ( n1 n2 --   форматный вывод n1 по размеру n2 )

  >R DUP >R ABS

  S>D <# #S R> SIGN #>

  R> OVER - 0 MAX SPACES TYPE

;

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

     CR   S"  Для выхода из программы нажать клавишу 1, для продолжения любую другую "  ANSI>OEM TYPE 

    BEGIN

   10 1 DO  CR  10 1 DO J I * 3 .R  LOOP  LOOP

        KEY  [CHAR]  1 = UNTIL  ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )

;

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\  текст программы окончен.

 

 

 

Пример 4     формирование  разных цветов  отображения экрана  по нажатию клавиши.

\ начало  текста

\ Формирование на  разных цветов  отображения экрана  по нажатию клавиши

WINAPI: SetConsoleTextAttribute  KERNEL32.DLL

: TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg )   0x10 * + H-STDOUT SetConsoleTextAttribute DROP ;

: UST_ATR_LIM_CMD    0xF  8  TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg )   ;

VARIABLE CWET

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

    CR   S"  Для выхода из программы нажать клавишу 1, для продолжения любую другую "  ANSI>OEM TYPE 

    BEGIN

    0  CWET @ TEXT-ATTR ( fg bg -- )

    CR S"   Меняем цвет фона  = " ANSI>OEM TYPE   CWET @ .

      CWET 1+!   CWET DUP @ 0x10 = IF  0! ELSE DROP THEN

       KEY  [CHAR]  1 = UNTIL  ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )

;

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\  текст программы окончен.

 

 

 

Пример 5     выполнение музыкального нажатия клавиш.

\ начало  текста

\ Выполнение музыкального нажатия клавиш

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

WINAPI: MessageBeep   USER32.DLL ( пищание системного динамика )

WINAPI: Beep KERNEL32.DLL        ( ФУНКЦИЯ  т-МС  F-ГЦ -- )

: ZWUK (   Т-мс F-гц --- )   Beep DROP  ;

DECIMAL

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

CR   S"  Для выхода из программы нажать клавишу ПРОБЕЛЛ, для продолжения любую другую "  ANSI>OEM TYPE 

 1  ( K -- )

BEGIN

    0x10 *  100  SWAP

    2DUP . .    ZWUK

    KEY DUP 0x20 = UNTIL  ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )

;

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\  текст программы окончен.

 

 

Пример 6     при нажатии клавиш перейти и открыть заданные web страницы.

\ начало  текста

\ При нажатии клавиш перейти - открыть заданные web страницы

5 CONSTANT  SW_SHOW

WINAPI:   ShellExecuteA     shell32.dll

: START_link_clik_V2 ( An n  -  PZout - выход да или нет )

    \ на входе адр выполнения сайта

     DROP

     SW_SHOW ( =5 )

     0 0      ( An K1 K2 K3 -- )  3 ROLL

     ( K1 K2 K3 An -- )

     S" open" DROP    0 ShellExecuteA  (  pz- --- )

; 

 

: START_S ( An n  -  )

  START_link_clik_V2 ( An n  -  PZout - выход да или нет )  DROP

  ;

 

: ST1 S" https://www.yandex.ru/"   START_S ( An n  -  ) ;

: ST2 S" http://www.rambler.ru/"   START_S ( An n  -  ) ;

: ST3 S" http://te.sibsutis.ru/"   START_S ( An n  -  ) ;

 

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

CR   S"  Для выхода из программы нажать клавишу ESC, для продолжения любую другую "  ANSI>OEM TYPE 

CR   S"  клавиша 1 - перейти на yandex     "  ANSI>OEM TYPE 

CR   S"  клавиша 2 - перейти на rambler    "  ANSI>OEM TYPE 

CR   S"  клавиша 3 - перейти сайт кафедры ТЭ СибГУТИ "  ANSI>OEM TYPE 

CR

0

BEGIN

     DUP [CHAR]  1 =  IF ST1 THEN

     DUP [CHAR]  2 =  IF ST2 THEN

     DUP [CHAR]  3 =  IF ST3 THEN

     DROP  

    KEY DUP 0x1B = UNTIL  ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )

;

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\  текст программы окончен.

 

 

 

Пример 7     формируется экран меню и клавишами меняем место курсора.

 

\ начало  текста

\ Формируется экран меню и клавишами q  w  a s  меняем место метки отображаемого тремя знаками <#>

 

 WINAPI: SetConsoleCursorPosition KERNEL32.DLL

 

: GotoXY ( x y -- )

\ установка координаты курсора в консоли.

  0x10000 * +   H-STDOUT SetConsoleCursorPosition DROP

;

 

: ?KEY1  ( K --> код клавиши )

   KEY?  ( читать признак события ) IF KEY  ( PENDING-CHAR @ -->   действие читать код )  ELSE 0    THEN

  ;

: FIX  ( M --> ) 0x100 /MOD   GotoXY ( x y --  установить курсор в место на экране  ) ;

 

\  контрольки для точек останова и для контроля переполнения стека

: STOP1 BEGIN ?KEY1 DUP 0x1B = IF BYE THEN 0x20 = UNTIL ;

CREATE KKS_B  0 ,

: KKS (  распечака штатными средствами )

     \ добавили предупреждение о  исчерпании стека

  BASE @ KKS_B ! ( систему счисления  на сохранение )

  CR ."  ctk,N--> " DECIMAL

  DEPTH DUP 1 < IF  DUP 0= IF  .      S"  Стек пустой!"    ( при 0 )

                           ELSE  DROP S" ОШИБКА - СТЕК ИСЧЕРПАН !!! "

                           THEN  ANSI>OEM TYPE 

                ELSE  DUP  .  HEX ."  = "

                      .SN

                THEN      S"   --> верх " ANSI>OEM TYPE

       KKS_B @ BASE ! ( вернули систему счисления  )

     ;

 

 0x100 CONSTANT KY1  

 CREATE  MST  0x800 , 

: MST_PKZ  MST @  FIX  S" <#>" TYPE

 \ MST @  KKS DROP  ( убрали контрольку )

   ;

 

: MENU  ( МЕНЮ )

0 FIX  ( установка места на экране )

     S"  Для выхода из программы нажать клавишу ESC, для продолжения любую другую "  ANSI>OEM TYPE 

CR   S"  клавиша 1 - перейти     "  ANSI>OEM TYPE 

CR   S"  клавиша 2 - уйти        "  ANSI>OEM TYPE 

CR   S"  клавиша 3 - найти       "  ANSI>OEM TYPE 

CR   S"  клавиша 4 - выйти       "  ANSI>OEM TYPE 

CR   S"  клавиша 4 - зайти       "  ANSI>OEM TYPE 

CR   S"                          "  ANSI>OEM TYPE 

CR   S"                          "  ANSI>OEM TYPE 

CR   S"                          "  ANSI>OEM TYPE 

CR   S"                          "  ANSI>OEM TYPE 

CR   S"  клавиша 0 - обновить экран     "  ANSI>OEM TYPE 

CR   S"  клавиши q w a s - управление меткой "  ANSI>OEM TYPE 

MST_PKZ

;

 

: IZM_MESTA_KURSORA ( K -- )

\ 0x800 FIX  DUP 0<> IF  KKS DROP STOP1 ELSE DROP THEN

 \ сдвиг по горизонтали

   DUP [CHAR]  q =  OVER [CHAR]  Q =  OR IF     MST  1+!  MST_PKZ THEN  

   DUP [CHAR]  w =  OVER [CHAR]  W =  OR IF -1  MST   +!  MST_PKZ THEN  

  \  сдвиг по вертикали 

   DUP [CHAR]  a =  OVER [CHAR]  A =  OR IF KY1         MST  +!  MST_PKZ THEN  

   DUP [CHAR]  s =  OVER [CHAR]  S =  OR IF KY1 NEGATE  MST   +!  MST_PKZ THEN  

   

   DROP

 ;

 

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

MENU  ( МЕНЮ )

0

BEGIN

     DUP [CHAR]  1 =  IF  THEN

     DUP [CHAR]  2 =  IF  THEN

     DUP [CHAR]  3 =  IF  THEN

     DUP [CHAR]  0 =  IF MENU THEN

     IZM_MESTA_KURSORA ( K -- )

    ?KEY1 DUP 0x1B = UNTIL  ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )

;

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   ) 

S" test2.exe" SAVE (  сохраняем файл исполнения  с именем  test2.exe )

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

\  текст программы окончен.

Пример 8  При нажатии разных клавиш формируется разное звуковое подтверждение.                 

\ начало текста программы

 WINAPI: mciSendStringA WINMM.DLL

 WINAPI: Beep KERNEL32.DLL  

 WINAPI: ShellExecuteA SHELL32.DLL

 

 CREATE ADR1 0x100 ALLOT 

 

: CONCAT-TO  >R  2SWAP SWAP OVER  R@ SWAP MOVE R> +   SWAP MOVE ;

: CONCAT 2OVER NIP OVER + DUP >R 1+ ALLOCATE THROW DUP >R CONCAT-TO R> R> 2DUP + 0 SWAP C! ;

 

: MID1  0 0x100 ADR1  S" OPEN muz.mid ALIAS MUSIC" DROP  mciSendStringA  0=

     IF  CR S" OK muz.mid " TYPE  0 0x100 ADR1 S" PLAY MUSIC" DROP mciSendStringA  DROP     

     ELSE  S" ? muz.mid" TYPE THEN  ;

 

: MID2 CR S" stop muz.mid " TYPE  0 0x100 ADR1 S" STOP MUSIC"  DROP  mciSendStringA  DROP

 0 0x100   ADR1  S" CLOSE MUSIC"  DROP    mciSendStringA  DROP ;

 

: DIRM ( An n -- ) DROP 5 0 0 3   ROLL S" OPEN" DROP 0  ShellExecuteA DROP ;

 

: DIR1 S" http://90.189.213.191:"  S" 4422/poteha/mid/muz.mid"   CONCAT  DIRM ;

 

: DIR2 S" https://disk.yandex."  S" ru/d/duzQ8WKSeH4opA"   CONCAT DIRM ;

 

: ZWUK   Beep DROP ;

 

: ZW1 DUP 0x10 * 0x100 SWAP 2DUP  . .  ZWUK ;

 

DECIMAL

: PIK_OT_KEY CR S" Выход - ПРОБЕЛ" S"  продолжить - любая другая"  2SWAP ANSI>OEM TYPE ANSI>OEM

 TYPE 1 BEGIN  ZW1

 DUP [CHAR] 0 = IF MID1 THEN

 DUP [CHAR] 9 = IF MID2 THEN

 DUP [CHAR] 8 = IF DIR1 THEN

 DUP [CHAR] 7 = IF DIR2 THEN

 DROP KEY DUP 0x20 = UNTIL  ;

\ -------------------------------------

 

 0 TO SPF-INIT?

 ' NOOP MAINX !

 ' PIK_OT_KEY   TO <MAIN> 

 S" test2.exe" SAVE

 BYE

\  окончание текста программы

 

 

 

Пример 9  При нажатии разных клавиш выполняется переход и восстановление текста примера и компилятора языка программирования.

·        Данный пример показывает возможность создания новых программ на основе старых текстов;

·        Все присутствует для дальнейшего развития;

·        Пример из программ по работе с термометрией элеваторов в оболочке с браузерами.

·        Скачать пример адрес перехода

·        Для компиляции текста примера в  программу использовать  spf4.exe  и обязательно использовать имена файлов из примера. Т.к. эти имена компилируются в тело exe.  Если у Вас другие имена NAME1-3, то и файлы тоже должны быть такими.

\  программа формирует приложение exe для открывания в браузере всех элеваторов

\ начало  текста

\ При нажатии клавиш перейти - открыть заданные web страницы

\ различные средства диагностики к уже имеющимся тоже добавляем

 

: ?KEY1  ( K --> код клавиши без останова  )   KEY? IF  PENDING-CHAR @  ELSE 0  THEN ;

: ?KEY0!  PENDING-CHAR 0!  ;  (  сбрасываем полученный код клавиши )

: STOP1 BEGIN ?KEY1 DUP 0x1B = IF BYE THEN 0x20 = UNTIL ( останов, выход по нажатию ESC продолжить - Пробел  ) ;

CREATE KKS_B  0 ,  ( переменная для временного хранения системы счисления )

: 4+ 4 + ;  

 

: KKS (  контроль стека с предупреждением о  исчерпании стека )

  BASE @ KKS_B ! ( систему счисления  на сохранение )

  CR ."  ctk,N--> " DECIMAL

  DEPTH DUP 1 < IF  DUP 0= IF  .  ."  STEK PUSTO!" ( при 0 )

                           ELSE  DROP ." ОШИБКА! - СТЕК ИСЧЕРПАН !!! "

                           THEN

                ELSE  DUP  .  HEX ."  = "     .SN

                THEN      ."   -->  "

       KKS_B @ BASE ! ( вернули систему счисления  )      ;

      

:  KKT  CR ."  tib,N--> " HEX #TIB @ .    HEX ."  ==> "

   #TIB @  DUP 0= IF 1+ THEN 0 DO TIB I + C@ EMIT LOOP  ; ( ----> показ из входного буфера TIB )

 

 

: S+++ ( A1 N1  A2 N2 -- A1' N1+N2 --  аналог сложения адресов из вторичнок к первичному т.е первичынй должен быть всегда с запасом )

  2OVER + ( A1 N1 A2 N2 A3 -- )

  OVER  (   A1 N1  A2 N2 A3 N2 --  )

  3 ROLL (  A1 N1  N2 A3 N2 A2 -- )

  -ROT   ( A1 N1   N2  A2 A3 N2--- ) CMOVE  +

  ( A1 N1+N2 --- )

;      

\ далее слова для выполнения действий по программе  ----------------------------  

 

 

 

5 CONSTANT  SW_SHOW

WINAPI: SetConsoleTitleA                     KERNEL32.DLL

WINAPI:   ShellExecuteA     shell32.dll

WINAPI: GetConsoleScreenBufferInfo      KERNEL32.DLL

WINAPI: SetConsoleWindowInfo            KERNEL32.DLL

WINAPI: SetConsoleTextAttribute                      KERNEL32.DLL

WINAPI: SetConsoleCursorPosition       KERNEL32.DLL

 

\ ------------------  создание - удаление дирректорий

1 CONSTANT MOVEFILE_REPLACE_EXISTING

2 CONSTANT MOVEFILE_COPY_ALLOWED

 

WINAPI: CreateDirectoryA     KERNEL32.DLL

WINAPI: RemoveDirectoryA     KERNEL32.DLL

 

 

 

: START_link_clik_V2 ( An n  -  PZout - выход да или нет )

    \ на входе адр выполнения сайта

     DROP

     SW_SHOW ( =5 )

     0 0      ( An K1 K2 K3 -- )  3 ROLL

     ( K1 K2 K3 An -- )

     S" open" DROP    0 ShellExecuteA  (  pz- --- )

;

 

CREATE DNx 0 ,

CREATE DNy 0 ,

CREATE BUF1 0 ,

CREATE CONSOLE_SCREEN_BUFFER_INFO  22 ALLOT

\ структура буфера

\     0 1 2 3   4 5 6 7   8 9 a b   c d e f

\     - - - -   x

 

 

: UST_RAZMEROV_CMD_N1 ( Dx Dy -- добавляем к сущ 8 строк )

 

      DNy  !   DNx !

   CONSOLE_SCREEN_BUFFER_INFO H-STDOUT GetConsoleScreenBufferInfo DROP  (  OK- информацию в буфер http://www.vsokovikov.narod.ru/New_MSDN_API/Console/fn_setconsolewindowinfo.htm   )

   8 ALLOCATE THROW BUF1 !

  CONSOLE_SCREEN_BUFFER_INFO  7 2* + DUP W@  ( A dX -- РАЗМЕР КОНСОЛИ ПО ГОРИЗОНТАЛИ )

                                   SWAP 2+ W@  (  dX dY  - РАЗМЕР КОНСОЛИ ВЕРТ И ГОРИЗОНТАЛЬ )

           SWAP  DNx @ +   BUF1 @  2 2* + W!  ( записали новое значение консоли по X )

  ( dY -- )    DNy @ +   BUF1 @  3 2* + W!  ( записали новое значение консоли по Y с увеличением на +0x8  для значения 800*600 больше нельзя  )

   BUF1 @    1 ( уст разм окна )   H-STDOUT   SetConsoleWindowInfo   DROP ( 0<> OK )

   BUF1 @ FREE DROP

 ;  

 

 

DECIMAL (  АТРИБУТЫ  ПЕРЕПИСЫВАЮТСЯ НАДО ОСТАВЛЯТЬ ДВА ПРОБЕЛЛА ДО ЗАПЯТОЙ  )

CREATE ATRT 00  ,      ( атрибут текста = 0 черный )

CREATE ATRF 15  ,      ( атрибут фона = 7  белый-серый ПО УМОЛЧАНИЮ В СТАНДАРТЕ ВИНДОВС МНЕ ПОСОВЕТОВАЛИ БИРЮЗУ ЭТО 10  )

HEX

( атрибут текста и фона   )

: ?WinError   0= IF GetLastError THROW THEN  ;

: TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg )   0x10 * + H-STDOUT SetConsoleTextAttribute ?WinError ;

: UST_ATR_LIM_CMD    0xF  8  TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg )   ;

: UST_ATR_LIM1_CMD    0xF  5  TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg )   ;

: UST_ATR_LIM2_CMD    0xF  0xA  TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg )   ;

: UST_ATR_NORM_CMD   ATRT @  ATRF @  TEXT-ATTR ( fg bg -- установка цвета знака fg фона bg    0xF - больая яркость знака ) ;

: COORD ( x y -- COORD )  ( 65536 ) 0x10000 * +  ( всe в HEX перевод в 32х разрядность ) ;

: GotoXY ( x y --  установка координаты курсора в консоли )  COORD H-STDOUT SetConsoleCursorPosition ERR THROW ;

: FIX  ( M --> ) 0x100 /MOD   GotoXY ( x y -- Установить курсор в нужное место консоли по x- y )  ;

: AR1   UST_ATR_NORM_CMD  0 FIX HEX

\  0 >R RP@ 0 MAX-XY    *   BL H-STDOUT FillConsoleOutputCharacterA R>  2DROP

  0x60 0x4F * DUP ALLOCATE THROW  ( N A ) 2DUP SWAP 0x20 ( N A A N K -- ) FILL ( N A -- )

  SWAP ( A N ) OVER ( A N A -- ) SWAP ( A A N -- ) TYPE ( A - )  FREE DROP  ( так быстрее получается значительно чем циклами )

 ;

 

: AR2  0xF ( ЗН )  0x1 ( ФОН ) TEXT-ATTR  0 FIX HEX

  0x60 0x4F * DUP ALLOCATE THROW  ( N A ) 2DUP SWAP 0x20 ( N A A N K -- ) FILL ( N A -- )

  SWAP ( A N ) OVER ( A N A -- ) SWAP ( A A N -- ) TYPE ( A - )  FREE DROP  ( так быстрее получается значительно чем циклами )

 ;

 

: CREATE-DIRECTORY ( addr u -- ior ) DROP 0 SWAP CreateDirectoryA  ( fr -- 0=ERR 0<>=OK если ужо есть такая  ) ;

 

: DELETE-DIRECTORY ( addr u -- ior ) DROP RemoveDirectoryA ( fr ) ;

 

: START_S ( An n  -  )

  START_link_clik_V2 ( An n  -  PZout - выход да или нет )  DROP

  ;

: ST1 S" http://90.189.164.185:4422/silos_v3/otchet_togo.html"               START_S ( An n  -  ) ;

: ST2 S" http://212.20.49.15:4422/silos_v3/otchet-berdsk-okno-grafik.html"   START_S ( An n  -  ) ;

: ST3 S" http://87.103.250.73:4423/silos_v3/otchet_bagan.html"   START_S ( An n  -  ) ;

: ST4 S" http://90.189.213.191:4422/temp/gr_mi38_37_mp5_sh/"   START_S ( An n  -  ) ;

 

CREATE WOST_MEM_TKS 0 , 0 , ( память here где будет храниться текст )

: NAME1 S" start_www_elevatorov_all_v1.f" ;

CREATE WOST_MEM_SPF 0 , 0 , ( память here где будет храниться SPF4  )

: NAME2 S" spf4.exe" ;

CREATE FR1 0 ,

 

\  CНАЧАЛА СОХРАНЯЕМ В ТЕЛЕ  1УЮ

   NAME1  R/O OPEN-FILE-SHARED  DROP ( fr - без проверки ) FR1 !

   FR1 @  FILE-SIZE  2DROP DUP (  Nb Nb --> получил кол-во байт  )

   HERE WOST_MEM_TKS ! ( записали начало памяти )

   ALLOT ( Nb - заняли в теле программы )

   WOST_MEM_TKS 4 + ! ( Nb кол-во записали )

   WOST_MEM_TKS DUP @ SWAP 4 + @ ( An n - ) FR1 @  READ-FILE    (  Nb PZ - считали в буфер  и убрали  ) 2DROP

   FR1 CLOSE-FILE ( fileid -- ior ) DROP  ( и закрыли тот файл для чтения )

 

\  СОХРАНЯЕМ В ТЕЛЕ  2УЮ

   NAME2  R/O OPEN-FILE-SHARED  DROP ( fr - без проверки ) FR1 !

   FR1 @  FILE-SIZE  2DROP DUP (  Nb Nb --> получил кол-во байт  )

   HERE WOST_MEM_SPF ! ( записали начало памяти )

   ALLOT ( Nb - заняли в теле программы )

   WOST_MEM_SPF 4 + ! ( Nb кол-во записали )

   WOST_MEM_SPF DUP @ SWAP 4 + @ ( An n - ) FR1 @  READ-FILE    (  Nb PZ - считали в буфер  и убрали  ) 2DROP

   FR1 CLOSE-FILE ( fileid -- ior ) DROP  ( и закрыли тот файл для чтения )

 

: NAME_K S" ishodniki\" ; ( каталог сохранения исходных файлов )

 

: WOSTANOVLENIE ( -- восстановление файлов )

\  первый файл восстанавливаем

   NAME_K CREATE-DIRECTORY  DROP 

\   файлы надо записывать в директории и поэтому формируем составное имя каталог\имя_файла

   0x100 ALLOCATE DROP DUP BUF1 ! 0 ( Aрд N=0 -- в памяти для построения длинного пути )

   NAME_K S+++ ( An1 N1 - сложили с буфером  каталог ) 

   NAME1 S+++ ( An2 N2 - сложили имя )  W/O CREATE-FILE-SHARED DROP ( FR БЕЗ ПРОВЕРКИ НА СОЗАДНИЕ  ) FR1 !

   WOST_MEM_TKS DUP @ SWAP 4+ @ ( An n -- ) FR1 @ WRITE-FILE ( c-addr u fileid -- ior ) DROP

   FR1 CLOSE-FILE ( fileid -- ior ) DROP  ( и закрыли тот файл для чтения )

   BUF1 @ FREE DROP ( - и память освободили )

 

\  второй файл восстанавливаем

   NAME_K CREATE-DIRECTORY  DROP 

   0x100 ALLOCATE DROP DUP BUF1 ! 0 ( Aрд N=0 -- в памяти для построения длинного пути )

   NAME_K S+++ ( An1 N1 - сложили с буфером  каталог ) 

   NAME2 S+++ ( An2 N2 - сложили имя ) W/O CREATE-FILE-SHARED DROP ( FR БЕЗ ПРОВЕРКИ НА СОЗАДНИЕ  ) FR1 !

   WOST_MEM_SPF DUP @ SWAP 4+ @ ( An n -- ) FR1 @ WRITE-FILE ( c-addr u fileid -- ior ) DROP

   FR1 CLOSE-FILE ( fileid -- ior ) DROP  ( и закрыли тот файл для чтения )

;

 

: MAIN  ( основное слово  выполняется постоянно в цикле, а для выхода останов до нажатия клавиши на клавиатуре )

 

\ UST_ATR_NORM_CMD

 AR2  0 FIX

S" Переход на сайты  объектов термоконтроля в НСО подготовленные  ОАО = Агромонтаж= г. Новосибирск, 2020-2023  " ANSI>OEM DROP    SetConsoleTitleA  DROP   ( работает  новое окно консоли тут вывод )  

   0x20 NEGATE ( dX ) 0xD NEGATE ( Yd )   UST_RAZMEROV_CMD_N1

CR   S"  Переход на сайты  объектов термоконтроля в НСО "  ANSI>OEM TYPE

CR   S"  подготовленные  ОАО = Агромонтаж= г. Новосибирск, 2020-2023 "  ANSI>OEM TYPE

CR   S"  -----------------------------------------------------        "  ANSI>OEM TYPE

CR   S"  Для выхода из программы нажать клавишу ESC. Цифровые клавиши: "  ANSI>OEM TYPE

CR   S"   1 - открыть элеватор =Тогучин=  "  ANSI>OEM TYPE

CR   S"   2 - открыть элеватор =Бердск=   "  ANSI>OEM TYPE

CR   S"   3 - открыть элеватор =Баган=    "  ANSI>OEM TYPE

CR   S"  клавиша ПРОБЕЛ - открыть все адреса объектов и выйти из программы "  ANSI>OEM TYPE

CR   S"  ------------------------------------------------------- "  ANSI>OEM TYPE

CR   S"  Дополнительно: "  ANSI>OEM TYPE

CR   S"   g - извлечь текст этой программы и компилятор языка FORTH "  ANSI>OEM TYPE

CR   S"   h - сайт по языку программирования FORTH, для самостоятельного редактирования. "  ANSI>OEM TYPE

CR   S"  Успехов и здровья! Подготовил - Шабронов А.А. тс+7-913-905-8839 "  ANSI>OEM TYPE

\ ----------------------------------------------------------------------

0

BEGIN

     DUP [CHAR]  1 =  IF ST1 EXIT THEN

     DUP [CHAR]  2 =  IF ST2 EXIT THEN

     DUP [CHAR]  3 =  IF ST3 EXIT THEN

     DUP 0x20 =  IF ST1 ST2 ST3  EXIT THEN

     DUP [CHAR]  g = OVER [CHAR]  G = OR IF WOSTANOVLENIE EXIT THEN

     DUP [CHAR]  h = OVER [CHAR]  H = OR IF ST4 EXIT THEN

     DROP 

    KEY DUP 0x1B = UNTIL  ( ПРОВЕРКА НАЖАТИЯ КЛАВИШИ, ЕСЛИ НАЖАЛИ 1 ТО КОД СОВПАЛ И ВЫХОДИМ )

;

: NAME3 S" start_www_elevatorov_all_v1.exe" ; ( имя исполняемого файла )

\  подготавливаем переменные  и текст программы записываем в исполняемый файл.

0  TO SPF-INIT?  (   в переменную записываем код 0 – означает что инициализация выполняется )

 '  NOOP MAINX !  ( в переменную записываем адрес выхода )

 '  MAIN   TO <MAIN>  ( в переменную записываем  старт программы со слова MAIN   )

  NAME3 SAVE (  сохраняем файл исполнения  с именем  NAME3 )

 

BYE (  выходим из режима редактирования и компиляция, т.е. все бай-бай )

 

\  текст программы окончен.

Список задач на программирование

1.     Изменить Пример_1  - звуки формируются разные при отображении чисел от 1 до 16. Нажимаем клавишу 1..F и выдается звук

2.     Изменить Пример_1  - звуки формируются только 3 частоты и разной длительности при отображении чисел от 1 до 16. Нажимаем клавишу 1..F и выдается звук.

3.     Изменить Пример_1 – звуки выдаются постоянно, с разной частотой. В звуках определить простейшую гармоническую мелодию. Выход по нажатию клавиши ESC.

4.     Изменить Пример_2 -  выдается серия 40 кодов на экране  одной нажатой клавиши в одной строке.

5.     Изменить Пример_2 -  выдать все возможные коды комбинаций отображений от 0 до 0xFF  в виде таблицы;

6.     Изменить Пример_2 – выдать все коды  комбинаций отображений от 0..0xFF  в файл

7.     Изменить Пример_3 – выдать таблицу умножения до 100 в формате 10-и таблиц

8.     Изменить Пример_3 -  выдать таблицу сложения до 100 в формате 10-и таблиц.

9.     Изменить Пример_3 -  выдать таблицу умножения в интервале  0x10000…0x10040  числами двойной длинны  в формате читаемых на экране таблиц;

10.  Изменить Пример_4 – выдать таблицу 0x10 на 0x10 где по вертикали меняется цвет фона, а по горизонтали цвет знака

11.  Изменить Пример_4 – выдать 2-е строки, которые с интервалом 1 секунда, меняют в первой – фон знака, а во второй цвет знака. Выход по нажатию клавиши ESC

12.  Изменить Пример_4 – Выдать цифру кода цвета фона и цифру кода цвета знака, обозначить их, установить цвет, с звуковым сопровождением. Нажимаем любую клавишу и получаем выдаваемое. Выход по клавише ESC

13.  Изменить Пример_5 – Выдавать звук только при нажатии цифровых клавиш 0…9

14.  Изменить Пример_5 – Выдавать звук только при нажатии текстовых клавиш строчных. Т.е. «а» «s»  и т.д.

15.  Изменить Пример_5 – Выдавать три звука при нажатии, которые бы составляли повышение тона(частоты). Нажимаем клавишу и слышим, выход по клавише ESC 

16.  Изменить Пример_6 – Открыть и перейти к программе Paint данного компьютера

17.  Изменить Пример_6 – Открыть и перейти к адресу сайта института, и выйти из программы примера

18.  Изменить Пример_6 -  Меню программы содержит текст адреса перехода и так же выполняется при нажатии соответствующей клавиши.

19.  Изменить Пример_7 – Изменить клавиши управления меткой на русские буквы

20.  Изменить Пример_7 – Ввести отображения места метки в виде числа номера строки и столбца

21.  Изменить Пример_7 – Ввести в меню отображения адреса перехода на сайт института и при выборе и  нажатии, программа должна спрашивать подтверждение и только потом переходить.

22.  Изменить Пример_8 - Ввести меню для  действий оператора, с описанием сохранения файла и выполнение звуковых сообщений.

23.  (с)Изменить Пример_9 –Ввести другие имена для сохранения файлов и проверять на достоверность по контрольной сумме. Т.е. если файл EXE искажен, то об этом сообщается и не выполняется извлечение из тела.

24.  (сс)Повторить свой вариант программы расчета коэффициентов гармоник для импульсных усилителей DFT-Berg.zip  так, что бы она работала 32х-64х разрядной системе Windows и в любых кодировках.

Задачи на программирование выполняются индивидуально. Номер задачи определяется по списку группы !  Разрешается выбор Nзадачи=Nмакс_группа + Nстудент. Например: участнику с N=5 при количестве в группе 15 допускается решать 5 или 20 задачу.  А участнику с N=1 допускается решать 1 или 16 задачу.   Не менее одной задачи. Шуточное отвлечение руководителя.  Меньше одной задачи, и не получиться. Это анекдот: Эй! Вы трое! Оба ко мне.

 Примечания:

 -c – задача повышенной сложности

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

   Отчет по программе предоставляется  3-мя файлами:  текст программы – f – файл формата текстового файла, исполняемый файл – exe файл, титульный сопроводительный файл – doc- формат документа WORD .  Отчет упаковать в архив zip. Титульный лист  должен иметь информацию с названием лекции и задания, Фио, номером группы, электронным адресом сохранения архивного файла. Смотрите правило составление отчетов. На контроль руководителю занятий отправлять один файл и указывать: фамилию группу тема курса лекций (программирование МП) номер лекции и номер задания см пример ниже. Названия файлов в архиве определяется самостоятельно учащимся, исходя их характера задания, своего понимания задачи программы и усвоения курса. Ниже скан почты руководителя с правильно оформленным почтовым отправлением домашнего задания.

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

 Литература

Наименование

Адрес

Учебное пособие 1 по языку ФОРТ

http://netlib.narod.ru/library/book0001/toc.htm

Учебное пособие 2 по языку ФOPT 

http://forth-j.narod.ru/book4.htm 

Учебное пособие 2 по языку ФОРТ

В формате_Word документа

Программирование на языке  ForthLogic

http://fif.by/data/files/forthlogicprogramming.pdf 

История Forth

http://www.sbup.com/wiki/Forth

Книги по форт

http://progbook.ru/forth/

Версии форт русскоязычные

http://www.forth.ru/

Графические оболочки

http://mgw.narod.ru/doc.htm      

http://mgw.narod.ru/

Версия spf

http://iweb.dl.sourceforge.net/project/spf/sp-forth4/sp-forth 4 build 16/spf4-016.exe

Справочник spf-4

http://spf.sourceforge.net/docs/intro.ru.html#forget

Форум по форту

http://fforum.winglion.ru/

Примеры программ простые

http://alexander-simakov.blogspot.ru/2010/12/forth.html

Дневник изучения Форта

http://forth-j.narod.ru/

nnCron и язык программирования Форт

http://www.nncron.ru/help/RU/working/nncron_forth.htm

История от А.Черезова создания spf4

http://www.enet.ru/win/cherezov/index.html

Форт-язык для микропроцессоров

http://www.codenet.ru/progr/other/forth/

Литература по форт

http://www.forth.org.ru/forth/lit.html

Пример для выполнения файлов –mid- -kar=

https://www.soel.ru/online/chetyryekhkanalnyy-retranslyator-1-wire-na-osnove-12f629/

 

-----------------

Автор Шабронов Андрей Анатольевич тс. +7-913-905-8839

shabronov@ngs.ru

 Ред. 2023-11-25