Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Сб дек 16, 2017 9:25 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 82 сообщения ]  На страницу Пред. 1 2 3 4 5 6
Автор Сообщение
 Заголовок сообщения: Re: Forth
СообщениеДобавлено: Вт апр 22, 2014 2:50 pm 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 542
Leency писал(а):
Ты сможешь пофиксить 1 и 2?

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

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


Вернуться к началу
 Заголовок сообщения: Re: Forth
СообщениеДобавлено: Вт апр 22, 2014 3:31 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4227
Если пофиксишь 1 и 2, то будем думать дальше. Тогда можно будет даже в сборку KolibriN Форт и Тетрис добавить.

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


Вернуться к началу
 Заголовок сообщения: Re: Forth
СообщениеДобавлено: Сб апр 26, 2014 6:00 am 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 542
Leency писал(а):
Если пофиксишь 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
СообщениеДобавлено: Сб апр 26, 2014 5:23 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4227
Есть SVN, там есть папка с Фортом. Аккаунт можно получить у Vilka или CleverMouse.

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


Вернуться к началу
 Заголовок сообщения: Re: Forth
СообщениеДобавлено: Сб апр 26, 2014 6:06 pm 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 542
Leency писал(а):
Есть SVN, там есть папка с Фортом. Аккаунт можно получить у Vilka или CleverMouse.

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


Вернуться к началу
 Заголовок сообщения: Re: Forth
СообщениеДобавлено: Вт янв 26, 2016 4:59 pm 
Не в сети

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

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


Вернуться к началу
 Заголовок сообщения: Re: Forth
СообщениеДобавлено: Сб июл 08, 2017 6:38 am 
Не в сети

Зарегистрирован: Пн мар 27, 2006 6:33 am
Сообщения: 542
Спойлер: Показать
Вложение:
img2.png
img2.png [ 80.01 КБ | 340 просмотров ]

Спойлер: Показать
Вложение:
img1.png
img1.png [ 86.04 КБ | 340 просмотров ]


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

В первом примере заполняется некоторая прямоугольная часть окна псевдослучайными цветными точками. Как видно цвета точек носят недостаточно случайный характер. Это сделано из соображений получения варианта обоев.
Код:
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

Второй демо пример получения расходящихся псевдослучайных линий.
Код:
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. Где лучше разместить не придумал т.к. есть ещё и тема например с примером игрушки (консольного Териса на Форт)
Тут же, вероятно добавлю ещё и некоторые иллюстративные моменты применения Форт. :)
Где и как ещё разместить этот и дополнительные иллюстративные материалы Форт тематики на усмотрение форумчан.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 82 сообщения ]  На страницу Пред. 1 2 3 4 5 6

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB