aForth - кросплатформенный FORTH-подобный язык.
Moderator: Shaos
-
- God
- Posts: 1078
- Joined: 03 Feb 2003 13:53
На самом деле, многозадочной форт машину можно сделать ввести слова типа fork, open, read, write,close, kill. Т.е. сначала фот машина форкает сама себя, создается вторая с таким же загруженным словарем и программой, затем вторая мишания окрывает новый словарь и программу, читает и исполняет до тех порт пока что не сделал и не получила сигнал kill, вообще такая машина на пропеллере бы пошла, классно.
ЗЫ: Кстати умные мысли не приходя только в одну голову http://www.jacobsdesign.com.au/software ... dforth.php
ЗЫ: Кстати умные мысли не приходя только в одну голову http://www.jacobsdesign.com.au/software ... dforth.php

Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Оно так и замышляется. Только наверное для запуска будет два слова - fork и spawn (spawn - будет создавать "чистую" форт-машину и выполнять на ней новый файл. Типа execa).cr0acker wrote:На самом деле, многозадочной форт машину можно сделать ввести слова типа fork, open, read, write,close, kill.
Кроме того хочу предусмотреть ещё два слова - sendmsg и recvmsg - для обмена сообщениями между aForth-машинами.
Параллакс у меня живой есть. Но там - 8 ядер имеется. И прерываний нет. Вообще. Хитроархитектурная штука.
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Примеры рабочих программ на aForth:
[/url]
Code: Select all
: CR "\n" . ; ( Возврат каретки )
(
Перевод строки в 10е число
str - входная строка
)
: atoi
dup size ( str size )
malloc ( str adr )
swap over ( adr str adr )
setmstr ( adr )
dup ( adr adr )
0 swap ( sum adr )
begin
dup getmchar ( adr sum adr char )
dup 0 = ( adr sum adr char cond )
if ( adr sum adr char )
drop drop swap ( sum adr )
free
1
else
'0' - ( adr sum adr digit )
swap ( adr sum digit adr )
1 nswap ( adr adr digit sum )
10 * + ( adr adr sum )
swap 1 + ( adr sum adr )
0
endif
until
;
"1234567890" dup . CR
atoi . CR
Code: Select all
( Копирование файла. )
"dict.af" include
(
dbgopen - Процедура, открывающая файл и возвращающаяя его дескриптор на стеке.
Если файл не удалось открыть - на стек кладётся -1.
)
: dbgopen dup open dup 0< if "Ошибка при открытии файла: " . swap . CR else "Файл: " . swap . " открыт\n" . endif ;
(
dbgcreat - Процедура, создающая файл и возвращающаяя его дескриптор на стеке.
Если файл не удалось открыть - на стек кладётся -1.
)
: dbgcreat dup creat dup 0< if "Ошибка при открытии файла: " . swap . CR else "Файл: " . swap . " открыт\n" . endif ;
(
dbgclose - закрывает файл и печатает результат. На стеке ничего не оставляет в отличие от close.
)
: dbgclose close 0< if "Ошибка при закрытии файла\n" . else "Файл закрыт\n" . endif ;
(
Копирование файла.
s - дескриптор источника
d - дескриптор приёмника
c - символ или код возврата
Вызов:
<s> <d> fcopy
)
: fcopy
( Состояния стека )
( s d )
begin
over over swap ( s d d s )
getchar ( s d d c )
( Проверка на конец файла )
dup 0< if ( s d d c )
drop drop ( s d )
1 ( s d 1 1-выход из цикла для until )
else
putchar ( s d )
0< if ( s d )
"Ошибка записи файла"
else
0 ( s d 0 0-повтор цикла для until )
endif
endif
until
( s d )
;
( Открываем файл )
"./forth.af" dbgopen
"./forth-copy.af" dbgcreat
( Копируем файл )
fcopy
( Закрываем файл )
dbgclose
dbgclose
Code: Select all
( Печать текстового файла )
"dict.af" include
(
dbgopen - Процедура, открывающая файл и возвращающаяя его дескриптор на стеке.
Если файл не удалось открыть - на стек кладётся -1.
)
: dbgopen dup open dup 0< if "Ошибка при открытии файла: " . swap . CR else "Файл: " . swap . " открыт\n" . endif ;
(
dbgclose - закрывает файл и печатает результат. На стеке ничего не оставляет в отличие от close.
)
: dbgclose close 0< if "Ошибка при закрытии файла\n" . else "Файл закрыт\n" . endif ;
(
Печать файла, дескриптор которого на стеке.
После печати - дескриптор остаётся на стеке
)
: dbgfprint begin dup getchar dup 0< if drop 1 else .C 0 endif until ;
( Открываем файл )
"./dumpfile.af" dbgopen
( Печатаем его )
dbgfprint
( Закрываем файл )
dbgclose
Code: Select all
: CR "\n" . ; ( Возврат каретки )
: XPFX "0x" . ; ( Печатает 0x )
: SPACE " " . ; ( Печать пробела )
: TAB "\t" . ; ( Печать табуляции )
: SLASH "\\" . ; ( Печать слэша )
( Печать всех символов от 32 до 255 )
: print-all-chars
32
""
begin
over +
swap 1 +
dup 255 >
if
drop
1
else
swap
over
0x0F and lnot if '\n' + endif
0
endif
until
. CR
;
print-all-chars
-
- God
- Posts: 1078
- Joined: 03 Feb 2003 13:53
Кстати это всё хорошо, но неплохо было бы, заиметь схему, разводку платы афорт машины? Кстати благодаря своей польской последовательсности афорт может выступать в роли баша для армос:) Ещё не плохо было бы добавить слово(если не пропустил) запуска произвольного бинарного кода:) И тогда получается что армос будет выступать своего рода микроядром, я форт машины интерфесом более высокого уровня:) Одна форт машина может обслжывать переферию,другая работать с файлами, третья запускать приложени, а из армос эти функции можно убрать, она будет только передавать сообщения
Десятая или 20ая форт машина может выступать даже в виде инерпритатора рв0 кода.


Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Разводку выложить не могу - отлаживаюсь не на своей плате и разводки нет.cr0acker wrote:Кстати это всё хорошо, но неплохо было бы, заиметь схему, разводку платы афорт машины? Кстати благодаря своей польской последовательсности афорт может выступать в роли баша для армос:) Ещё не плохо было бы добавить слово(если не пропустил) запуска произвольного бинарного кода:) И тогда получается что армос будет выступать своего рода микроядром, я форт машины интерфесом более высокого уровня:) Одна форт машина может обслжывать переферию,другая работать с файлами, третья запускать приложени, а из армос эти функции можно убрать, она будет только передавать сообщенияДесятая или 20ая форт машина может выступать даже в виде инерпритатора рв0 кода.
Но там AT91SAM7S256 + FLASH AT45DB081, подключенная по SPI размером 8 Мбайт.
Подключение - стандартное, обвязка проца - тоже (там обвязки то - кварц да кондёры). По этим данным платку сделать - раз плюнуть. Я просто первую попавшуюся платку взял и ковыряюсь. Ну и терминал - на порт DBGU цепляется.
Добавить слово "запустить любой машкод" - это не проблема. Но смысла немного в таком слове при программировании форт-машины и возможности записи-чтения в любую точку памяти (слова setm* getm*).
Сейчас хочу первым делом сделать нормальный ввод с терминала и слово save для выгрузки текущего состояния aForth-машины.
Плюс - приём-передача файла по протоколу TSA (он уже поддержан на PC и в NEDOPC-ARMOS).
Тогда получится самостоятельная aForth-система с выгрузкой состояния и возможностью автозагрузки.
Идея простая - при загрузке системы дать пользователю скажем 3 сек в течении которых он может нажать любую клавишу на терминале и вывалиться в интерактивную форт-машину.
Если же он не нажимал клавишь - подгружается файл, скажем init.af и выполняется в форт-машине.
Вообще на повестке дня (из задач, сложных для реализации):
- слова обработки ошибок. скажем система, если определено слово onerror будет очищать при ошибке стеки и выполнять его, поместив на стек код ошибки и прочие данные.
- Приём-передача сообщений между форт-машинами. Скажем при приёме сообщения выполняется слово onmsg, если оно определено и выполнение программы продолжается.
- fork() spawn() kill() - запуск-останов форт-машин.
А простых-мелких задач типа математики и обработки строк - вообще ещё тьма.
-
- God
- Posts: 1078
- Joined: 03 Feb 2003 13:53
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
-
- God
- Posts: 1078
- Joined: 03 Feb 2003 13:53
Как кусок памяти?SfS wrote:Сделал команду save, которая выгружает всё в текстовый файл.
Всё бы ничего - но не знаю пока как выгружать байтовые массивы array.
Остальное - на ура прокатывает.
Выгружаются все слова и переменные, НО НЕ СТЕК!.

Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Неа выгрузка производится в виде ИСХОДНОГО ТЕКСТА. Даже с форматированием для читабельности.cr0acker wrote:Как кусок памяти?
ПОка спал пришла мысль сделать возможность задавать константу-байтовый массив типа так:
{ 00 23 45 66 "Строка" 'A' 'Б' } array MASSIV
Тогда можно и в программе это задавать и выгружать.
Конечнно, если массив адреса содержит - то выгружать его бесполезно - но тут уж все сами думать должны. А для таблиц - милое дело.
-
- Admin
- Posts: 24023
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
В принципе моё поделко aForth могёт собраться на всём, на чём есть С.Shaos wrote:Я то тут, но я лично перед окунанием в 32-битный мир хотел бы до конца изведать прелести мира 8-битного и затем 16-битногоcr0acker wrote:Угу, вот недописюк появился, Шаос , АУУУУУУУУ:)
Все биты-флаги у меня вроде как в пределах 8 бит, все раззмеры - через sizeof().
Если и есть где пара узких разрядно-зависимых мест - можно и поправить. Только у меня сейчас 8- 16-битного железа нет, чтобы туда портировать и проверить.
-
- Admin
- Posts: 24023
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
А у меня есть NedoPC-91, на который я периодически пытаюсь RW0-движок водрузитьSfS wrote:В принципе моё поделко aForth могёт собраться на всём, на чём есть С.Shaos wrote:Я то тут, но я лично перед окунанием в 32-битный мир хотел бы до конца изведать прелести мира 8-битного и затем 16-битногоcr0acker wrote:Угу, вот недописюк появился, Шаос , АУУУУУУУУ:)
Все биты-флаги у меня вроде как в пределах 8 бит, все раззмеры - через sizeof().
Если и есть где пара узких разрядно-зависимых мест - можно и поправить. Только у меня сейчас 8- 16-битного железа нет, чтобы туда портировать и проверить.

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
В принципе можно попробовать Портануть ARMOS на AVR. Я пока не вижу особых проблем. Разве что прошерстить на предмет правильности указания типов и разрядности.Shaos wrote:А у меня есть NedoPC-91, на который я периодически пытаюсь RW0-движок водрузить
Самый геморр - переписать драйвера под систему прерываний, UART и PIO для AVR - и будет 8/16 разрядная ОСЬКА.
И aForth - поверх неё.
Ограничения - надо AVR с внешним ОЗУ хотя бы на 32К и флешкой. Иначе ничего кроме "Hello world!" не запустишь толком.
В общем - я пока форт до ума доведу на SAM7. А там - может и к AVRу обращусь.
Сейчас на очереди поддержка массивов в виде констант для их загрузки-выгрузки. Это, пожалуй, последнее, что в язык надо для полноценности включить.
Ну и компрессия-декомпрессия при выгузке-загрузке "на лету". Очень оно память экономит.
-
- Doomed
- Posts: 491
- Joined: 16 Apr 2005 22:35
- Location: Томск
Доделал работу с массивами.
Теперь массив можно объявить так:
10 array A - массив размером 10 байт, забитый нулём
Пустой массив:
0 array A
{ } array A
Массив, заполненный значениями:
{
1 3 4 34 0x14 "Строка"
} array A
Массив из другого массива (копия):
{ A } array B
Целые числа в массиве интерпретируются поразному - по умолчанию - как целые. Но могут и как байты и как короткие целые:
{
byte 0x11 0x33 0x44
short 0x1234 0x2344
int 0x12345678 0x87654321
} array A
Выгружается массив всегда как массив байт.
Теперь массив можно объявить так:
10 array A - массив размером 10 байт, забитый нулём
Пустой массив:
0 array A
{ } array A
Массив, заполненный значениями:
{
1 3 4 34 0x14 "Строка"
} array A
Массив из другого массива (копия):
{ A } array B
Целые числа в массиве интерпретируются поразному - по умолчанию - как целые. Но могут и как байты и как короткие целые:
{
byte 0x11 0x33 0x44
short 0x1234 0x2344
int 0x12345678 0x87654321
} array A
Выгружается массив всегда как массив байт.