если вы пишете свой собственный ЦК или движок, вот тестовая дема для проверки что все работает и работает как надо
Код:
\ примеры структур управления
\ кроме control flow control команд используются расширения conio (консольный ввод/вывод) и debug (отладка)
\ также используются команды из CORE WORDSET типа стековых операций и операций с памятью
\ в комментариях в квадратных скобках показано то, что должно выводится при выполнении кода
\ этот пример демонстрирует возможности языка ассемблера системы BF,
\ за исключением возможностей подсистемы многозадачности (см. отдельную дему)
\ если вы пишете свою реализацию BF, корректное выполнение этого кода значит, что у вас
\ есть работающий движок с самым минимальным набором команд форт-машины (к нему надо просто добавить
\ еще где-то с полсотни команд из стандарта Форта) и компилятор, и вы можете писать софт,
\ по необходимости добавляя недостающие команды в движок. Главное, что самый сложный этап -- реализацию
\ структур управления -- вы уже прошли 8-)
0x0A const EOL \ константа -- конец строки 0x0A
: cr EOL emit ; \ макрос вывода конца строки
0 var tvar \ пример переменной (используется далее в циклах)
: 1+ 1 # + ; \ еще один пример макроса -- инкремент
\ пустой стек
{ EmptyStack
s. \ [ ]
}
\ литералы (числовые константы в коде) пишутся в коде в виде <число> #
{ Literals
0 # 2 # -3 # s. drop drop drop \ [ 0 2 -3 ]
}
{ if/else/endif
-1 # if 111 # else 222 # endif s. drop \ [ 111 ]
0 # if 111 # else 222 # endif s. drop \ [ 222 ]
1 # if 111 # else 222 # endif s. drop \ [ 111 ]
}
{ do/loop
cr 10 # -10 # do i . loop cr \ -10 -9 ... -1 0 1 ... 8 9
}
{ begin/while/repeat
cr
begin \ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
tvar @ 0x10 # <
while
tvar @ 1+ tvar !
tvar @ .
repeat cr
}
{ begin/until
cr
-5 # tvar !
begin \ -4 -3 -2 -1 0 1 2 3 4 5 6
tvar @ 1+ tvar !
tvar @ .
tvar @ 5 # > until
cr
}
{ begin/again \ бесконечный цикл с выводом счетчика
cr
begin
tvar @ 1+ tvar !
tvar @ . 0x0D # emit
again
}
{ DEMO
EmptyStack
Literals
if/else/endif
do/loop
begin/while/repeat
begin/until
begin/again
}
save" CTLDEMO"