Board.KolibriOS.org

Official KolibriOS board
It is currently Mon Sep 16, 2019 3:41 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 83 posts ]  Go to page Previous 1 2 3 4 5 6
Author Message
 Post subject: Re: Forth
PostPosted: Tue Apr 22, 2014 2:50 pm 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 666
Leency wrote:
Ты сможешь пофиксить 1 и 2?

Хорошо, только я с SVN "не дружу" поэтому выложу в данной теме. :)

P.S. Какие ещё идеи?


Top
   
 Post subject: Re: Forth
PostPosted: Tue Apr 22, 2014 3:31 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5061
Если пофиксишь 1 и 2, то будем думать дальше. Тогда можно будет даже в сборку KolibriN Форт и Тетрис добавить.

_________________
Через тернии к звездам


Top
   
 Post subject: Re: Forth
PostPosted: Sat Apr 26, 2014 6:00 am 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 666
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


Top
   
 Post subject: Re: Forth
PostPosted: Sat Apr 26, 2014 5:23 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5061
Есть SVN, там есть папка с Фортом. Аккаунт можно получить у Vilka или CleverMouse.

_________________
Через тернии к звездам


Top
   
 Post subject: Re: Forth
PostPosted: Sat Apr 26, 2014 6:06 pm 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 666
Leency wrote:
Есть SVN, там есть папка с Фортом. Аккаунт можно получить у Vilka или CleverMouse.

Хорошо, но мне пока не приходилось работать с SVN.


Top
   
 Post subject: Re: Forth
PostPosted: Tue Jan 26, 2016 4:59 pm 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 666
Начал "терзать" (смотреть функционал системных функций через слова SYS1 SYS2 ... SYSV при работе внутри Форт системы или правя init.f файл и запуская meForth) и столкнулся с таким моментом
если просто "закольцевать" бесконечно через BEGIN ... AGAIN вызов исследуемой функции, то это негативно влияет на работу шела системы
и не нашёл, при этом как удалить процесс MeForth штатными системными средствами.

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


Top
   
 Post subject: Re: Forth
PostPosted: Sat Jul 08, 2017 6:38 am 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 666
Spoiler: Show
Attachment:
img2.png
img2.png [ 80.01 KiB | Viewed 1784 times ]

Spoiler: Show
Attachment:
img1.png
img1.png [ 86.04 KiB | Viewed 1784 times ]


Некоторые примеры программного Форт кода c некоторыми комментариями (часть не сформированной статьи по текущему Форт базиса SPF4 в KoliriOS)
Первый пример построен по "классике" с организацией оконного приложения и обработки событий (для него скрееншот не сделал)
также добавлен некоторые демонстрационные проверки баланса стека (если есть боязнь программирования с использованием его. В начале BEGIN его получаем. а в конце цикла контролируем. Запомненное значение на стеке никуда не исчезает между началом и концом цикла :)
Второй и третий пример более просты.
Code:
\ Обратный слеш (\) применяется в языке Форт для комментирования строк.  Всё что расположено между ( круглыми скобками ) комментарий. 
\ Зачастую они применяются для комментирования нотации к слову. Слова в данном Форт регистрозависимы и не забываем про пробелы.
\ Форт в Колибри прямой предок прославленного российского Форта 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:
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:
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. Где лучше разместить не придумал т.к. есть ещё и тема например с примером игрушки (консольного Териса на Форт)
Тут же, вероятно добавлю ещё и некоторые иллюстративные моменты применения Форт. :)
Где и как ещё разместить этот и дополнительные иллюстративные материалы Форт тематики на усмотрение форумчан.


Top
   
 Post subject: Re: Forth
PostPosted: Tue Jan 08, 2019 7:49 pm 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 666
На хабре публикуется цикл статей по 64-х битной байтовой Форт машине в рамках Linux (язык реализации ассемблер).

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

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 83 posts ]  Go to page Previous 1 2 3 4 5 6

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited