nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 18 Apr 2024 23:57



Reply to topic  [ 38 posts ]  Go to page Previous  1, 2, 3  Next
aForth - кросплатформенный FORTH-подобный язык. 
Author Message
God
User avatar

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

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


23 Jul 2008 00:19
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
cr0acker wrote:
На самом деле, многозадочной форт машину можно сделать ввести слова типа fork, open, read, write,close, kill.


Оно так и замышляется. Только наверное для запуска будет два слова - fork и spawn (spawn - будет создавать "чистую" форт-машину и выполнять на ней новый файл. Типа execa).

Кроме того хочу предусмотреть ещё два слова - sendmsg и recvmsg - для обмена сообщениями между aForth-машинами.

Параллакс у меня живой есть. Но там - 8 ядер имеется. И прерываний нет. Вообще. Хитроархитектурная штука.


23 Jul 2008 00:40
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
Примеры рабочих программ на aForth:

Code:
: 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:
( Копирование файла. )

"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:
( Печать текстового файла )

"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:
: 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

[/url]


23 Jul 2008 00:45
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Кстати это всё хорошо, но неплохо было бы, заиметь схему, разводку платы афорт машины? Кстати благодаря своей польской последовательсности афорт может выступать в роли баша для армос:) Ещё не плохо было бы добавить слово(если не пропустил) запуска произвольного бинарного кода:) И тогда получается что армос будет выступать своего рода микроядром, я форт машины интерфесом более высокого уровня:) Одна форт машина может обслжывать переферию,другая работать с файлами, третья запускать приложени, а из армос эти функции можно убрать, она будет только передавать сообщения :) Десятая или 20ая форт машина может выступать даже в виде инерпритатора рв0 кода.

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


23 Jul 2008 01:38
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
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() - запуск-останов форт-машин.

А простых-мелких задач типа математики и обработки строк - вообще ещё тьма.


23 Jul 2008 03:57
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
Угу, вот недописюк появился, Шаос , АУУУУУУУУ:)

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


23 Jul 2008 04:10
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
cr0acker wrote:
Угу, вот недописюк появился, Шаос , АУУУУУУУУ:)


Ещё до появления... как до пекина...
И проблема больше не в форт-системе, а в файловой системе - глюкает она у меня на флеше. А хочется полноценную - с каталогами-подкаталогами-правами.


23 Jul 2008 06:21
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
Сделал команду save, которая выгружает всё в текстовый файл.
Всё бы ничего - но не знаю пока как выгружать байтовые массивы array.
Остальное - на ура прокатывает.
Выгружаются все слова и переменные, НО НЕ СТЕК!.


23 Jul 2008 09:26
Profile
God
User avatar

Joined: 03 Feb 2003 13:53
Posts: 1078
Reply with quote
Post 
SfS wrote:
Сделал команду save, которая выгружает всё в текстовый файл.
Всё бы ничего - но не знаю пока как выгружать байтовые массивы array.
Остальное - на ура прокатывает.
Выгружаются все слова и переменные, НО НЕ СТЕК!.

Как кусок памяти?

_________________
Image
Формат конференции позволяет сказать то что я действительно думаю о проблемах...
(с) Путин


23 Jul 2008 11:25
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
cr0acker wrote:
Как кусок памяти?


Неа выгрузка производится в виде ИСХОДНОГО ТЕКСТА. Даже с форматированием для читабельности.
ПОка спал пришла мысль сделать возможность задавать константу-байтовый массив типа так:

{ 00 23 45 66 "Строка" 'A' 'Б' } array MASSIV
Тогда можно и в программе это задавать и выгружать.
Конечнно, если массив адреса содержит - то выгружать его бесполезно - но тут уж все сами думать должны. А для таблиц - милое дело.


23 Jul 2008 17:19
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22540
Location: Silicon Valley
Reply with quote
Post 
cr0acker wrote:
Угу, вот недописюк появился, Шаос , АУУУУУУУУ:)


Я то тут, но я лично перед окунанием в 32-битный мир хотел бы до конца изведать прелести мира 8-битного и затем 16-битного ;)

_________________
:dj: https://mastodon.social/@Shaos


23 Jul 2008 17:40
Profile WWW
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
Shaos wrote:
cr0acker wrote:
Угу, вот недописюк появился, Шаос , АУУУУУУУУ:)


Я то тут, но я лично перед окунанием в 32-битный мир хотел бы до конца изведать прелести мира 8-битного и затем 16-битного ;)


В принципе моё поделко aForth могёт собраться на всём, на чём есть С.
Все биты-флаги у меня вроде как в пределах 8 бит, все раззмеры - через sizeof().

Если и есть где пара узких разрядно-зависимых мест - можно и поправить. Только у меня сейчас 8- 16-битного железа нет, чтобы туда портировать и проверить.


23 Jul 2008 19:04
Profile
Online
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22540
Location: Silicon Valley
Reply with quote
Post 
SfS wrote:
Shaos wrote:
cr0acker wrote:
Угу, вот недописюк появился, Шаос , АУУУУУУУУ:)


Я то тут, но я лично перед окунанием в 32-битный мир хотел бы до конца изведать прелести мира 8-битного и затем 16-битного ;)


В принципе моё поделко aForth могёт собраться на всём, на чём есть С.
Все биты-флаги у меня вроде как в пределах 8 бит, все раззмеры - через sizeof().

Если и есть где пара узких разрядно-зависимых мест - можно и поправить. Только у меня сейчас 8- 16-битного железа нет, чтобы туда портировать и проверить.


А у меня есть NedoPC-91, на который я периодически пытаюсь RW0-движок водрузить ;)

_________________
:dj: https://mastodon.social/@Shaos


23 Jul 2008 20:02
Profile WWW
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
Shaos wrote:
А у меня есть NedoPC-91, на который я периодически пытаюсь RW0-движок водрузить ;)


В принципе можно попробовать Портануть ARMOS на AVR. Я пока не вижу особых проблем. Разве что прошерстить на предмет правильности указания типов и разрядности.

Самый геморр - переписать драйвера под систему прерываний, UART и PIO для AVR - и будет 8/16 разрядная ОСЬКА.

И aForth - поверх неё.

Ограничения - надо AVR с внешним ОЗУ хотя бы на 32К и флешкой. Иначе ничего кроме "Hello world!" не запустишь толком.

В общем - я пока форт до ума доведу на SAM7. А там - может и к AVRу обращусь.

Сейчас на очереди поддержка массивов в виде констант для их загрузки-выгрузки. Это, пожалуй, последнее, что в язык надо для полноценности включить.

Ну и компрессия-декомпрессия при выгузке-загрузке "на лету". Очень оно память экономит.


23 Jul 2008 21:25
Profile
Doomed

Joined: 16 Apr 2005 22:35
Posts: 492
Location: Томск
Reply with quote
Post 
Доделал работу с массивами.
Теперь массив можно объявить так:
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

Выгружается массив всегда как массив байт.


25 Jul 2008 02:56
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 38 posts ]  Go to page Previous  1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 34 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 Group
Designed by ST Software.