Page 6 of 6

Re: Forth

Posted: Sat Apr 26, 2014 6:00 am
by Kopa
Leency wrote:Если пофиксишь 1 и 2, то будем думать дальше. Тогда можно будет даже в сборку KolibriN Форт и Тетрис добавить.
По пункту 1.
Достаточно в файле meForth.asm убрать условную компиляцию (после метки Mems:) и оставить только
dd FINFO.path
В файле src\compiler\spf_translate.f
строку : AUTOXEC ... ;
заменить на : AUTOEXEC MEMS 8 + @ 255 INCLUDED_ ;
(255 как бы в этом случае с избытком для длины пути имени файла)
Пути при этом, при запуске и в подключаемых файлах прописываются полностью.

По пункту 2. (явно проявляется в Qemu)
Возможно достаточно в файле meForth.asm заккоментировать вызов процедуры erase-screen
и можно уменьшить размер консольного экрана (оставив только игровую область) с выводом помощи по клавишам вначале в эту область

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

Что находится в области меток удобно смотреть штатным словом DUMP ( adrr len -- )
Пример отображения области входной строки при запуске Форт системы:
MEMS 8 + @ 100 DUMP

Re: Forth

Posted: Sat Apr 26, 2014 5:23 pm
by Leency
Есть SVN, там есть папка с Фортом. Аккаунт можно получить у Vilka или CleverMouse.

Re: Forth

Posted: Sat Apr 26, 2014 6:06 pm
by Kopa
Leency wrote:Есть SVN, там есть папка с Фортом. Аккаунт можно получить у Vilka или CleverMouse.
Хорошо, но мне пока не приходилось работать с SVN.

Re: Forth

Posted: Tue Jan 26, 2016 4:59 pm
by Kopa
Начал "терзать" (смотреть функционал системных функций через слова SYS1 SYS2 ... SYSV при работе внутри Форт системы или правя init.f файл и запуская meForth) и столкнулся с таким моментом
если просто "закольцевать" бесконечно через BEGIN ... AGAIN вызов исследуемой функции, то это негативно влияет на работу шела системы
и не нашёл, при этом как удалить процесс MeForth штатными системными средствами.

P.S. Чем (как) можно ограничить выделенные такты в подобных "монопольных" ситуациях для работоспособности рабочего стола?
И может как то эту ситуацию периодически детектировать и задать вопрос о удалении данного процесса с опцией-флагом (не спрашивать в дальнейшем)
через какое то время если данная ситуация продолжает иметь место. Использовал пока QEMU машину для тестов и возможно описанная ситуация не так
критична на нативном железе.
К сведению: после вызова SYS функций типично необходимо использовать DROP для сохранения баланса стека если EAX ничего не возвращает
или в дальнейшем не используется. (печать содержимого стека словом .S) Слова регистрозависимы и ключевые слова используют верхний регистр в данном Форт (но можно наверное этот параметр изменять)

Re: Forth

Posted: Sat Jul 08, 2017 6:38 am
by Kopa
Spoiler:
img2.png
img2.png (80.01 KiB)
Viewed 8875 times
Spoiler:
img1.png
img1.png (86.04 KiB)
Viewed 8875 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. Где лучше разместить не придумал т.к. есть ещё и тема например с примером игрушки (консольного Териса на Форт)
Тут же, вероятно добавлю ещё и некоторые иллюстративные моменты применения Форт. :)
Где и как ещё разместить этот и дополнительные иллюстративные материалы Форт тематики на усмотрение форумчан.

Re: Forth

Posted: Tue Jan 08, 2019 7:49 pm
by Kopa
На хабре публикуется цикл статей по 64-х битной байтовой Форт машине в рамках Linux (язык реализации ассемблер).

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

P.S. Предыдущие части
Часть 1 Часть 2

Re: Forth

Posted: Thu May 28, 2020 12:08 pm
by Leency
Добавил в ссылку на Forth в статью http://kolibri-n.org/inf/hll/hll

Сам компилятор залит на SVN и лежит тут: SVN://programs/develop/SPForth/

Re: Forth

Posted: Sun Jun 04, 2023 9:55 am
by KPG
Статья в тематике Форт с Хабр (попала и в дневной топ)
My4TH — домашний компьютер без процессора

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