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