Forth

...
  • Есть SVN, там есть папка с Фортом. Аккаунт можно получить у Vilka или CleverMouse.
    Из хаоса в космос
  • Leency wrote:Есть SVN, там есть папка с Фортом. Аккаунт можно получить у Vilka или CleverMouse.
    Хорошо, но мне пока не приходилось работать с SVN.
  • Начал "терзать" (смотреть функционал системных функций через слова SYS1 SYS2 ... SYSV при работе внутри Форт системы или правя init.f файл и запуская meForth) и столкнулся с таким моментом
    если просто "закольцевать" бесконечно через BEGIN ... AGAIN вызов исследуемой функции, то это негативно влияет на работу шела системы
    и не нашёл, при этом как удалить процесс MeForth штатными системными средствами.

    P.S. Чем (как) можно ограничить выделенные такты в подобных "монопольных" ситуациях для работоспособности рабочего стола?
    И может как то эту ситуацию периодически детектировать и задать вопрос о удалении данного процесса с опцией-флагом (не спрашивать в дальнейшем)
    через какое то время если данная ситуация продолжает иметь место. Использовал пока QEMU машину для тестов и возможно описанная ситуация не так
    критична на нативном железе.
    К сведению: после вызова SYS функций типично необходимо использовать DROP для сохранения баланса стека если EAX ничего не возвращает
    или в дальнейшем не используется. (печать содержимого стека словом .S) Слова регистрозависимы и ключевые слова используют верхний регистр в данном Форт (но можно наверное этот параметр изменять)
  • Spoiler:
    img2.png
    img2.png (80.01 KiB)
    Viewed 8567 times
    Spoiler:
    img1.png
    img1.png (86.04 KiB)
    Viewed 8567 times
    Некоторые примеры программного Форт кода c некоторыми комментариями (часть не сформированной статьи по текущему Форт базиса SPF4 в KoliriOS)
    Первый пример построен по "классике" с организацией оконного приложения и обработки событий (для него скрееншот не сделал)
    также добавлен некоторые демонстрационные проверки баланса стека (если есть боязнь программирования с использованием его. В начале BEGIN его получаем. а в конце цикла контролируем. Запомненное значение на стеке никуда не исчезает между началом и концом цикла :)
    Второй и третий пример более просты.

    Code: Select all

    \ Обратный слеш (\) применяется в языке Форт для комментирования строк.  Всё что расположено между ( круглыми скобками ) комментарий. 
    \ Зачастую они применяются для комментирования нотации к слову. Слова в данном Форт регистрозависимы и не забываем про пробелы. 
    \ Форт в Колибри прямой предок прославленного российского Форта SPF4 (коллективного продукта разных разработчиков)
    \ Предлагаемая первая программа - это один из возможных "каркасов" связи ядра системы с окружением ОС.
    
    
    \ добавим слово МS и проиллюстрируем использования API Kолибри
    \ В Форт системе для Колибри введены обёртки слов API такие как SYS1  SYS2  SYS3  SYS4
    \ SYS5  SYSV
    \ Номера в этих словах введены для однозначного определения количества параметров 
    \  переданных на стеке соответствующей системной функции
    \ самый верхний элемент стэка при передаче параметров есть номер системной функции
    \ остальное суммарное количество параметров смотрится из описания системной функции 
    \ и соответственно выбирается название слова с соответствующей цифрой 1 2 3 4 или 5
    \  SYSV функции передаётся указатель на структуру данных.
    
     
    : MS ( ms -- ) 10 / 5 SYS2 DROP ;
    \ номер функции 5, количество параметров данной функции 2, соответственно и SYS2
    \  дополнительно делится переданный параметр функции на 10
    \ и за не надобностью результата работы функции (или его просто нет) 
    \ удаляем верхний элемент стека словом DROP
    \ остальные переданные параметры при передаче в сис. функцию удаляются автоматически
    \ верхний же параметр стека в данном Форте расположен в регистре процессора EAХ
    \ и по «совместительству» имеет возвращаемое значение (или нет) для системных вызовов
      
    \ Всегда можно проверить нарушения баланса стека, например при сомнении
    \ в работе слова, до и после какого то действия воспользовавшись отладочной 
    \ печатью .S и остановив выполнение программы словом KEY ожидание ввода символа 
    \ что и будет тоже продемонстрировано в ниже представленом коде.
    \ DEPTH даёт текущую глубину стека
    \ если значение верхушки стека распечатывается по . (точке), но дальше оно необходимо  
    \ то его дублируют перед печатью словом DUP
    
    : Test         
       PAGE .S  \ Очистим консольное окно словом PAGE 
                       \ и отобразим состояния стека данных при входе в программу словом .S
       BEGIN    \ начало «бесконечного» цикла (почти как в Паскаль языке) 
          CR 10 12 AT-XY ." </" DEPTH DUP  .  \ продублируем и распечатаем начальный DEPTH
                                                                           \ глубину стека для справки, запомним что на стеке 
                                                                           \ оставлено значение DEPTH
                 REDRAW     \ перерисуем окно 
    
                 65535        \  значение цета кнопки 
    	                   \ выбрать можно используя калькулятор и пипетку
                 12365535   \ как то связано с идентиiфикатором кнопки :)
                         144 16 LSHIFT 25 +  \ 144 y координата  25 размер «сливаем» вместе сдвигая
                         200 16 LSHIFT 60 +  \ 200 x координата  60 размер «сливаем» вместе сдвигая
                 8 SYS5 DROP  \ 8 номер функции определить кнопку, параметры уже подготовили
                                     \ и посчитали, если функция ничего не возвращает, 
                                     \ то номер функции оставшийся в EAX - регистре верхушки стека удаляем
                 
    \             100 MS      \ а зачем тогда вводили, если закоментировали? :)
            
                 10 SYS1 PAGE 15 12 AT-XY ." Событие: "  \ . CR  \ ожидаем событие   
                 DUP 3 AND IF  
                             DUP 1 = IF ." 1 - Премещение/Потеря/восстановление фокуса окна " THEN
                             DUP 2 = IF ." 2 - Нажатие клавишы " 2 SYS1 . THEN
                                 3 = IF 17 SYS1 . ( DROP ) ." Hello World "  CR  CR
    
                                       ."  Выход из консольного окна - BYE " CR 
                                       ."  Очистка консольного окна -  PAGE" CR
                                       ."  Список слов системы - WORDS" CR
                                       ."  Повторный запуск программы - Test " CR
                                       EXIT THEN
                           ELSE  . ." - Событие не определено" KEY DROP
                           THEN 
                 \ получим новое значение DEPTH, вычтем 1 и сравним с предыдущим
                 \ оставленным на стеке в начале бесконечного цикла
                 DEPTH  1- DUP . ." />"  <> IF ." Стек нарушен" KEY DROP EXIT THEN
            \  KEY DROP
             
            AGAIN   
    ;
     Test     
     

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

    Code: Select all

    0 VARIABLE RND 53770 RND !
    0 VARIABLE X
    0 VARIABLE Y
    
    : RANDOM RND @ 31421 * 6972 + DUP RND ! ;
    : RND# ( n - n` )  RANDOM  * ;
    : ColorGet ( -- rndcolor )
               160 RND# 8 LSHIFT
                80 RND# 16 LSHIFT
                16 RND# 24 LSHIFT
                OR OR 
    ;
    
    : RNDP ( y x -- )
                 ColorGet
                 ROT ROT
                 1 SYS4 DROP \ KEY DROP
    ;
    : SCRFILL 
                 400 0 DO 
                      300 0 DO I 45 + J 10 + RNDP 
                            LOOP
                    LOOP
    ;
    
    -1 -1 100 200 67 SYS5 DROP
    PAGE DEPTH . 
    SCRFILL 
    DEPTH . KEY DROP
    
    Второй демо пример получения расходящихся псевдослучайных линий.

    Code: Select all

    0 VARIABLE X 
    0 VARIABLE Y
    
    : SG 300 X ! 90 Y ! ;
    : -X -10 X +! ;
    : +X 10  X +! ;
    : -Y -15 Y +! ;
    : +Y 15  Y +! ;
    : LG  \ 0x00FF00FF  
          ColorGet   \ слово из предыдуего примера
                     200 16 LSHIFT X @ +
                     200 16 LSHIFT Y @ +
                     38 SYS4 DROP  \ KEY DROP 
    ;
    : LL 20 0 DO LG -X LOOP ;
    : DD 15 0 DO LG +Y LOOP ;
    : RR 20 0 DO LG +X LOOP ;
    : UU 15 0 DO LG -Y LOOP ;
    : PIC SG LL DD RR UU ;
    
    PAGE 
     PIC KEY DROP
     
    Как же этот код запустить в Форте для Koлибри?
    У меня пока так.

    1. Помещаем содержимое примера в файл INIT.F (комментарии можно пропустить).
    2. INIT.F файл располагаем на диске /rd/1
    3. Запуск данного файла на выполнение через исполнение МeForth файла.(название, конечно можно поменять например, на KoForth но не суть)

    А если в процессе экспериментов с Форт системой места на /rd/1 диске не достаточно, то можно в данном файле указать строку загрузки из соответствующего места.

    P.S. Где лучше разместить не придумал т.к. есть ещё и тема например с примером игрушки (консольного Териса на Форт)
    Тут же, вероятно добавлю ещё и некоторые иллюстративные моменты применения Форт. :)
    Где и как ещё разместить этот и дополнительные иллюстративные материалы Форт тематики на усмотрение форумчан.
  • На хабре публикуется цикл статей по 64-х битной байтовой Форт машине в рамках Linux (язык реализации ассемблер).

    Байт-машина для форта (и не только) по-индейски (часть 3)

    P.S. Предыдущие части
    Часть 1 Часть 2
  • Добавил в ссылку на Forth в статью http://kolibri-n.org/inf/hll/hll

    Сам компилятор залит на SVN и лежит тут: SVN://programs/develop/SPForth/
    Из хаоса в космос
  • Статья в тематике Форт с Хабр (попала и в дневной топ)
    My4TH — домашний компьютер без процессора

    P.S. И ещё небольшая статья Лёгкий Форт
  • Who is online

    Users browsing this forum: No registered users and 3 guests