Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 01:40

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 12:53 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
MrYuran писал(а):
Надо так:

: COMOutN ( char[] handle N -- )
0 DO DUP >R COMOut R> LOOP
DROP ;


а можно и так:
<pre>
: >COM ( [carr] # fid --> )
>R BEGIN DUP WHILE
SWAP R@ COMout
1 -
REPEAT DROP
RDROP ;
</pre>

или так:

<pre>
REQUIRE TILL .\devel\~moleg\lib\util\for-next.f

: >COM ( [carr] # fid --> ) SWAP FOR TUCK COMout TILL DROP ;
</pre>

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 12:55 
Не в сети

Зарегистрирован: Вс июн 21, 2009 19:11
Сообщения: 81
Откуда: Н.Новгород
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Ещё один вопрос.
Как вывести float в COM-порт побайтно (начиная с младшего)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 13:06 
Не в сети

Зарегистрирован: Вс июн 21, 2009 19:11
Сообщения: 81
Откуда: Н.Новгород
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
mOleg писал(а):
или так:
REQUIRE TILL .\devel\~moleg\lib\util\for-next.f
: >COM ( [carr] # fid --> ) SWAP FOR TUCK COMout TILL DROP ;

И что это за загадочный TUCK (для меня загадочный)
Как вообще найти, откуда слово и что делает?
Вот в gforth есть классное слово see, которое декомпилирует слово, стоящее за ним, вплоть до ассемблера, если это примитив


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 13:11 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
MrYuran писал(а):
А как вывести со стека, но в том порядке, в котором их положили?


: COM_OUUT_N ( ... handle N -- )
?DUP IF ROT >R 1- RECURSE R> OVER COMOut EXIT
THEN DROP ;

MrYuran писал(а):
На стеке же 16р числа лежат, а мы выводим чары...
что-то я совсем запутался


Для SPF - 32p. Берутся младшие разряды.
Кстати старшие разряды можно использовать в качестве завершающего
признака.

REQUIRE NUMBER? ~mak\LIB\fpcnum.f

: COM_OUUT_S ( -1 ... handle -- )
OVER 0xFF INVERT AND 0=
IF SWAP >R RECURSE R> OVER COMOut
EXIT THEN 2DROP ;

-1 'H' 'E' 'L' 'L' 'O' COMPORT_ID COM_OUUT_S


Последний раз редактировалось Mihail Чт июл 23, 2009 13:40, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 13:14 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
MrYuran писал(а):
И что это за загадочный TUCK (для меня загадочный)

TUCK ( a b --> b a b ) - то есть подкладывает копию верхнего элемента стека под нижний
в данном случае есть список байт, отправляемых в порт и id порта:

cn .. c3 c2 c1 fid
после TUCK будет:
cn .. c3 c2 fid c1 fid
а COMout, я понял, снимает два числа с вершины стека

MrYuran писал(а):
Как вообще найти, откуда слово и что делает?

гм, если речь идет об СПФе, легче посмотреть в исходный текст системы, можно так же пользоваться ANSI94 стандартом (в том числе в переводе)

MrYuran писал(а):
Вот в gforth есть классное слово see, которое декомпилирует слово, стоящее за ним, вплоть до ассемблера, если это примитив

в СПФе есть дизасм lib\ext\disasm.f

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 13:21 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
MrYuran писал(а):
Как вывести float в COM-порт побайтно (начиная с младшего)

вообще, вы ведь скорее всего собираетесь выводить содержимое массива, то есть у вас будет адрес и длина на входе:
<pre>
: >COM ( addr # fid --> )
>R BEGIN DUP WHILE
OVER C@ R@ COMout
1 -1 D+
REPEAT DROP RDROP ;
</pre>

а пример с рекурсией - это жесть :)

кстати, есть еще слово PICK (которое умеет копировать любой элемет стека на его вершину) но его лучше не пользовать, имхо.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 13:39 
Не в сети
Аватара пользователя

Зарегистрирован: Вс мар 04, 2007 08:02
Сообщения: 229
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
mOleg писал(а):
: >COM ( addr # fid --> )

>R BEGIN DUP WHILE

OVER C@ R@ COMout

1 -1 D+

REPEAT DROP RDROP ;


ХХы!

" 1 -1 D+ " - прикольно, не сразу прочухал. Респект.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 14:17 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
MrYuran писал(а):
На худой конец, как из-под форта запустить внешние приложения (сделать типа bat-ника на форте)


Если для SPF4 ( для windows ) в папке devel\~ac\lib\process\ есть примеры

P.S. Например можно искать используя имя функции из Win API
поиск, например, по слову CreateProcessA найдет ещё реализации.
это же относится и к другим win Форт системам ( например к Win32Forth )

P.P.S. Пример с рекурсией - это что то:) ( перенос значений с одного стека на другой )
PICK был бы самым простым решением.
Значения также можно формировать в выделенном буфере.

Mihail писал(а):
-1 'H' 'E' 'L' 'L' 'O' COMPORT_ID COM_OUUT_S


S" HELLO" COMPORT_ID COM_OUT_S \ проще cмотрится :)

или так -1 "O "L "L "E "H COMPORT_ID COM_OUUT_S \ :)

MrYuran писал(а):
Как вообще найти, откуда слово и что делает?


В разных Форт системах одни и те же слова могут иметь разную семантику
а могут и вообще не быть:) ( если они нестандартные, а токовых очень много )

MrYuran писал(а):
Хотя на самом деле и так не надо, а надо (с т.з. сишника) завести структуру и кидать её в файл и из)


В Форте тоже можно использовать структуры.
А как в освоении Форта Сишный опыт не мешает?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 15:10 
Не в сети

Зарегистрирован: Вс июн 21, 2009 19:11
Сообщения: 81
Откуда: Н.Новгород
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Хорошо. Пойдём другим путём.
В какую сторону "растёт" стек?
И где хранится адрес вершины?
Например:
Сохраняю указатель стека данных в стеке возврата, перекидываю его на начало буфера, накидываю всё что нужно, восстанавливаю указатель и отправляю буфер в СОМ-порт
Mihail - маркер конца буфера это классно придумано. Как я сам не догадался.

Ух, ё-моё... и это только отправка пакета...
А ведь ещё приём будет...
С такими темпами начальник меня загрызёт...
Ну и хрен с ним, дело принципа...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 15:14 
Не в сети

Зарегистрирован: Вс июн 21, 2009 19:11
Сообщения: 81
Откуда: Н.Новгород
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Локальный стек - нету такого понятия?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 15:18 
Не в сети
Аватара пользователя

Зарегистрирован: Вс мар 04, 2007 08:02
Сообщения: 229
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Лишнее это, от лукавого...
Кладешь на стек адрес начала буфера, сверху количество байтов, и далее - как в последнем посте mOleg'а


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 15:38 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Kopa писал(а):
Mihail писал(а):

-1 'H' 'E' 'L' 'L' 'O' COMPORT_ID COM_OUUT_S


S" HELLO" COMPORT_ID COM_OUT_S \ проще cмотрится

или так -1 "O "L "L "E "H COMPORT_ID COM_OUUT_S \


У меня там рекурсия. Будет послано в той последовательности,
в которой литералы следуют в исходном тексте.
Бывает, нужно посылать последовательность служебных кодов - результаты неких операций.

Для случая
Код:
S" HELLO" COMPORT_ID COM_OUT_S

в место COM_OUT_S подойдет WRITE-FILE THROW


Последний раз редактировалось Mihail Чт июл 23, 2009 16:04, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 15:48 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
MrYuran писал(а):
В какую сторону "растёт" стек?

стек обычно растет вниз

MrYuran писал(а):
И где хранится адрес вершины?

стека данных в EBP стека возвратов в ESP

MrYuran писал(а):
Сохраняю указатель стека данных в стеке возврата, перекидываю его на начало буфера, накидываю всё что нужно, восстанавливаю указатель и отправляю буфер в СОМ-порт

это лишнее. То есть можно и подобным образом, но черевато ошибками.
тем более, что вам это всеравно не поможет выкинуть правильно содержимое (стек заглатывает данные по 4 байта а не побайтно)
да и область стека огнаничена системой

MrYuran писал(а):
Ух, ё-моё... и это только отправка пакета...
А ведь ещё приём будет...

старайтесь делать проще. форт очень прост, просто не надо усложнять себе жизнь.
старайтесь пользоваться минимальным количеством параметров на стеке данных.
вот в случае отправки лучше не кидать все на стек - будет и дольше и солжнее! лучше из памяти
кстати, есть еще такой штамп:

( addr # --> ) OVER + SWAP DO I C@ Outport LOOP

да, в вашем случае номер порта можно не прередавать на стеке в определение, а использовать для этого переменную:

USER-VALUE ComPort

где-то в начале инициализации:

( fid --> ) TO ComPort

слово для вывода:
: >COM ( b --> ) Comport OUTport ;

и ввода:
: COM> ( --> b ) ComPort INport ;

и дальше пользуйтесь ими

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 15:51 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
MrYuran писал(а):
Локальный стек - нету такого понятия?

смотря в какой форт-системе. в Форке есть, есть в CMAL32 может еще где есть.

в любом случае можно создавать необходимое число стеков внутри системы, с помощью, например: .\devel\~moleg\lib\util\stack.f

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт июл 23, 2009 16:03 
Не в сети
Moderator
Moderator

Зарегистрирован: Ср май 10, 2006 15:37
Сообщения: 1132
Откуда: Chelyabinsk ( Ural)
Благодарил (а): 0 раз.
Поблагодарили: 9 раз.
MrYuran писал(а):
Хорошо. Пойдём другим путём.
В какую сторону "растёт" стек?
И где хранится адрес вершины?
..


Куда растёт стек можно узнать косвенно применяя слово
DEPTH ( -- n ) текущее количество элементов стека данных

для Spf определены слова SP@ RP@ SP! RP!
S0 ( адрес указатель дна стека данных )
R0 ( адрес указатель дна стека возвратов )

P.S. Eщё обычно в системе существует временная область PAD ( -- addr ) \ этой области,
но длительная сохранность данных в ней не предусмотрена.


Последний раз редактировалось Kopa Чт июл 23, 2009 16:26, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 57 ]  На страницу Пред.  1, 2, 3, 4  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB