Forth http://www.fforum.winglion.ru/ |
|
ef \ esoteric forth \ http://www.fforum.winglion.ru/viewtopic.php?f=40&t=3244 |
Страница 2 из 15 |
Автор: | Total Vacuum [ Вт авг 06, 2019 14:17 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
f02732 писал(а): Это чем-то зашифровано? Нет, это я выбросил комментарии, пробелы и переводы строки. |
Автор: | Total Vacuum [ Вт авг 06, 2019 18:00 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Ядро: Код: \ file: c \
` .model tiny .8086 .code .startup cld mov bx,0FC00h jmp main @5F: ; _ mov ax,[bx] @pop: lea bx,[bx+2] ret @23: ; # dec bx dec bx mov [bx],ax ret @24: ; $ xchg ax,[bx] ret @3F: ; ? shl ax,1 xchg di,ax mov ax,[bx+di] ret @2D: ; - neg ax @2B: ; + add ax,[bx] db 3Dh @2A: ; * imul word ptr [bx] db 3Dh @26: ; & and ax,[bx] db 3Dh @5E: ; ^ xor ax,[bx] db 3Dh @7C: ; | or ax,[bx] jmp short @pop @3D: ; = xor ax,[bx] sub ax,1 sbb ax,ax jmp short @pop @3C: ; < xchg ax,[bx] @3E: ; > sub ax,[bx] mov cl,15 sar ax,cl jmp short @pop @21: ; ! xchg di,ax mov ax,[bx] mov [di],ax jmp short @2drop @40: ; @ xchg di,ax mov ax,[di] ret @2E: ; . xchg di,ax mov ax,[bx] mov [di],al @2drop: call @5F;_ call @5F;_ ret @2C: ; , xchg di,ax xor ax,ax mov al,byte ptr [di] ret main: ` |
Автор: | Total Vacuum [ Вт авг 06, 2019 18:02 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Чтение файла: Код: \ file: f \
: x \ fclose \ ` push bx xchg bx,ax mov ah,3Eh int 21h pop bx ` _ ; : o \ fopen \ ` xchg dx,ax mov ah,3Dh xor cx,cx int 21h ` ; : g \ fgetc \ ` push bx xchg bx,ax mov ax,3F00h mov cx,1 push ax mov dx,sp int 21h pop ax xor ah,ah pop bx ` ; |
Автор: | Total Vacuum [ Вт авг 06, 2019 18:03 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Вывод: Код: \ file: o \
: c \ putc \ \ c --- \ ` mov dl,al mov ah,2 int 21h ` _ ; : b \ hex (byte) \ \ c --- \ # ` shr ax,4 ` \ 15 \ 9 6 + & # 9 > { '7' ~ '0' } + c \ 15 \ 9 6 + & # 9 > { '7' ~ '0' } + c ; : h \ hex \ \ n --- \ # ` shr ax,8 ` b b ; : s \ puts \ \ a --- \ # , ( # , c 1 + # , ) _ ; |
Автор: | Total Vacuum [ Вт авг 06, 2019 18:04 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
... и сам транслятор: Код: \ file: efx86.ef \
% c \ core \ % o \ out \ % f \ file \ \ a push address (label) \ \ b % o hex (byte) \ \ c % o putc \ \ d pass \ \ e enlarge token string \ \ f [ ] file \ \ g % f fgetc \ \ h % o hex \ \ i [ ] label index \ \ j jmp \ \ k case \ \ l [ ] token length \ \ m newline \ \ n next token \ \ o % f fopen \ \ p [ ] return stack pointer \ \ q [ ] quick search table \ \ r [ ] return stack \ \ s % o puts \ \ t [ ] token \ \ u unstack address \ \ v verify \ \ w write code \ \ x % f fclose \ \ y yet another char \ \ z jz \ : y \ yet another char \ f @ g # q . ; : e \ enlarge token string \ l # @ q , 1 ? t + . 1 + $ ! ; : n \ next token \ 0 # l ! t ( t ( y # '!' < & ) q , '\' = # ( y '\' - ) ) e t , # # # ''' = # { y e _ } $ '"' = | $ '`' = | ( # y e - ) _ l @ t + . ; : a \ push address (label) \ i @ p @ 2 * r + ! i # @ 1 + $ ! p # @ 1 + $ ! ; : u \ unstack label \ p # # @ 1 - $ ! @ 2 * r + @ ; : m \ newline \ 5 # + c ; : k \ case \ 1 ? , = ; : j \ jmp \ "jmp l" s ; : v \ verify \ 'l' c i @ h ':' c a "cmp ax,0" s m ; : z \ jz \ "jne t" s i @ h m j i @ h m 't' c i @ h ':' c a ; : w \ write code \ # ''' k $ , # ':' < $ '/' > & | { # "#" w "mov ax,0" s ''' k { 1 + , ~ , '0' - } h 'h' c m ~ '"' k { # "#" w "lea ax,$+5" s m j i @ h m "db " s s ",0" s m 'l' c i @ h ':' c i # @ 1 + $ ! ~ '`' k { 1 + # , '`' - ( # , c 1 + # , '`' - ) ~ '{' k { v u _ "_" w z ~ '~' k { j i @ h m 'l' c u h ':' c a ~ '}' k { u 'l' c h ':' c ~ '(' k { v "_" w z ~ ')' k { u j u h m 'l' c h ':' c ~ '[' k { v z "dec ax" s m ~ ']' k { u j u h m 'l' c h ':' c "_" w ~ "call @" s # , b m } } } } } } } } } } _ ; : d \ pass \ f @ $ o f ! \ open \ n t , ( ':' t , = { n j t , # # b m '@' c b ':' c 0 q t , + . n t , ';' - ( t w n t , ';' - ) "ret" s m 'l' c b ':' c ~ '%' t , = { n t d ~ t w } } n t , ) f @ x f ! \ close \ ; '{' # [ # q + 1 $ . ] 0 p ! '@' # + # # , # { 1 + } + 0 $ . 2 + \ argv \ d "ret" s m 'a' - [ # q + 'a' + , { '@' c # 'a' + # b ':' c "#" w "lea ax,d+0" s 'A' - ' ' # * * h 'h' c m "ret" s m } ] "d dw 29696 dup(?)" s m "end" s |
Автор: | Total Vacuum [ Вт авг 06, 2019 18:08 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Лежит тут: http://totalvacuum.ru/EF/00000000.zip ax top of stack bx data stack pointer Компилировать так: Код: efx86.com efx86.ef>efx86.asm tasm.exe /m9 efx86.asm tlink.exe /t /x efx86.obj Будет работать в XP/7(32bit) |
Автор: | f02732 [ Вт авг 06, 2019 19:26 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Код: lea ax,$+5 О, щи... у эзотерического форта даже выхлоп эзотерический...jmp l0008 db " Hello, world!",0 l0008:call @73 ret @7A:call @23 lea ax,d+0E400h ret @79:call @23 lea ax,d+0E000h ret @77:call @23 lea ax,d+0D800h ret @76:call @23 lea ax,d+0D400h ret @75:call @23 lea ax,d+0D000h ret @74:call @23 lea ax,d+0CC00h ret @72:call @23 lea ax,d+0C400h ret @71:call @23 lea ax,d+0C000h ret @70:call @23 lea ax,d+0BC00h ret @6E:call @23 lea ax,d+0B400h ret @6D:call @23 lea ax,d+0B000h ret @6C:call @23 lea ax,d+0AC00h ret @6B:call @23 lea ax,d+0A800h ret @6A:call @23 lea ax,d+0A400h ret @69:call @23 lea ax,d+0A000h ret @66:call @23 lea ax,d+09400h ret @65:call @23 lea ax,d+09000h ret @64:call @23 lea ax,d+08C00h ret @61:call @23 lea ax,d+08000h ret d dw 29696 dup(?) end Зачем это? |
Автор: | Total Vacuum [ Вт авг 06, 2019 21:19 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
f02732 писал(а): О, щи... у эзотерического форта даже выхлоп эзотерический... Зачем это? Замысел был такой: Есть 26 пользовательских слов a-z. Те слова, которые пользователь не переопределил через : ... ;, считаются массивами размера 1K. Соответственно, выхлоп (код после db "hello world") - это реализация неиспользованных пользователем слов, помещает в стек адрес первого элемента массива. Можно было бы придумать явный способ объявления массивов/переменных, но лень Можно, конечно, помечать те переменные, которые использованы хотя бы раз, а в конце выводить только их, но это усложняет транслятор. На данном этапе на первом месте стоит простота транслятора, размер и уж тем более красота выходного файла пока волнует меньше всего. Но если придумается какой-то лаконичный способ исключения неиспользованных слов, то обязательно сделаю. Любые идеи/пожелания приветствуются |
Автор: | KPG [ Ср авг 07, 2019 09:38 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Total Vacuum писал(а): Друзья, а какая реализация Форт, на ваш взгляд, является самой: 0) удивительной/необычной/нестандартной/красивой; 1) правильной, т.е. образцом для подражания; 2) неправильной/страшной/уродливой; А, какие проекты Форт уже были просмотрены? P.S. Например в языке ForthLogic (Форт для ПЛК) определённым образом включены таймерные переменные для распараллеливания задач. На базе ассемблерного Reva Forth сделан CoSy, но поизучать "руки" как то не дошли. Ни один антивирус с virustital не нашёл в esoteric forth вируса, наверное сигнатуры известных вирусов "намного" больше данного размера файла. На Reva в разных вариациях ругаются отчасти (из оригинального места и из CoSy по разному) |
Автор: | Total Vacuum [ Ср авг 07, 2019 18:13 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
KPG писал(а): P.S. Например в языке ForthLogic (Форт для ПЛК) определённым образом включены таймерные переменные для распараллеливания задач. На базе ассемблерного Reva Forth сделан CoSy, но поизучать "руки" как то не дошли. Спасибо, присмотрюсь к этим вещам повнимательнее. KPG писал(а): Ни один антивирус с virustital не нашёл в esoteric forth вируса, наверное сигнатуры известных вирусов "намного" больше данного размера файла. Он все еще слишком громоздок, т.к. многие вещи из-за нехватки пользовательских слов делались по методу copy/paste Можно было бы использовать заглавные буквы A-Z и даже (скажу по секрету) русские, но это "не в духе esoteric forth" Немного сплющил, числа 0-9 убрал в ядро, обработчики слов : и % include перенес в compile, ну и кое-что по мелочи Вместо 2.5K компилируется в 2.2K. Лежит тут: http://totalvacuum.ru/EF/00000001.zip |
Автор: | KPG [ Ср авг 07, 2019 18:47 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Total Vacuum писал(а): Он все еще слишком громоздок, т.к. многие вещи из-за нехватки пользовательских слов делались по методу copy/paste Можно было бы использовать заглавные буквы A-Z и даже (скажу по секрету) русские, но это "не в духе esoteric forth" Для чего тогда возможно использовать 8-й свободный бит команды? (immediate?) P.S. И, если % устанавливает контекст (core, file, ...) то это может служить изменением контекста пользовательских букв (что то близкое к включению контекста поиска в другом словарике букв). |
Автор: | Total Vacuum [ Ср авг 07, 2019 19:23 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
KPG писал(а): Для чего тогда возможно использовать 8-й свободный бит команды? (immediate?) Возможно. С другой стороны, пока не очень хочется лезть в старшую половину ASCII-таблицы, т.к. могут быть проблемы с кодировками. KPG писал(а): P.S. И, если % устанавливает контекст (core, file, ...) то это может служить изменением контекста пользовательских букв (что то близкое к включению контекста поиска в другом словарике букв). Интересная мысль, надо обмозговать. У меня были такие мысли по поводу контекста: разрешить вложенные объявления слов. Пример: Код: : x \ контекст x \ ... : m ... ; \ с этого момента m означает max \ ... m \ можно использовать max внутри x \ ... ; ... : y \ контекст y \ ... : m ... ; \ с этого момента m означает min \ ... m \ можно использовать min внутри y \ ... ; ... m \ переменная/массив m (по-умолчанию), в max или min превратится только после вызова x или y \ ... x m \ переключение на x и вызов max \ ... y m \ переключение на y и вызов min \ Сейчас, кстати, можно пользоваться вложенными объявлениями слов, но объявление в нескольких местах подпрограммы с одним и тем же именем приведет к ошибке во время компиляции. Тут нужно реализовывать режим интерпретации (через простой call m такие вещи не сделать), по команде : в словаре будет обновляться адрес обработчика для следующего за двоеточием слова. |
Автор: | Total Vacuum [ Ср авг 07, 2019 22:08 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Еще более безумная идея родилась... Пишем Код: : u : a : r : t \ UART \ ... \ общие действия для всех слов из этого блока, помещаем в стек UART Base Address \ : c : r ... ; ; \ UART Control Register, добавляем смещение к UART Base Address \ : s : r ... ; ; \ UART Status Register \ ... ; ; ; ; ... uartcr ! \ настраиваем UART \ ... uartsr @ \ читаем статус UART \ или Код: : m \ слова m... \ : a : x ... ; ; \ max \ : i : n ... ; ; \ min \ ; ... 2 3 max \ 2 3 -- 3 \ 1 2 min \ 1 2 -- 1 \ ... Осталось придумать механизм "сброса" контекста, если слово найдено или поиск пошел куда-то не туда. Будет работать жутко медленно, но для богатых периферией микроконтроллеров без таких трюков не обойтись... |
Автор: | Total Vacuum [ Вт авг 13, 2019 17:51 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Код: %c%s:k1?,=;:yf@g#q.;:ul#@q,1?t+.1+$!;:n0#l!1(1(y#'!'<&)q,'\'=#(y '\'-))ut,###'''=#{yu_}$'"'=|$'`'=|(#yu-)_l@t+!;:m5#+c;:w'l'ch':' c;:ai#@$#@1+$!;:d"#"e;:r"_"e;:vi@w"cmp ax,0"sma;:j"jmp l"shm;:z "jne tl"si@##hmj't'cwa;:e':'k{_nt,##j'@'cb':'c0qt,+.nt,';'-(tent ,';'-)"ret"smw~'%'k{_ntp~'''k{d"mov ax,0"s1+,b'h'cm~'"'k{d "lea ax,$+5"smi@j"db "ss",0"smaw~'`'k{#l@+1-0$.1+s~'{'k{_v_rz~ '~'k{_i@jwa~'}'k{_w~'('k{_vrz~')'k{_$jw~'['k{_vz"dec ax"sm~']'k{ _$jwr~"call @"s,bm}}}}}}}}}}}};:pf@$of!nt,(tent,)f@xf!;'{'#[#q+1 $.]'@'#+1+##1-,+0$.1+p'`'-[#q+'a'+,{'@'c#'a'+#b':'cd"lea ax,d+0" s'A'-' '#**h'h'cm"ret"sm}]"d:end"s Еще немного сплющил, исполняемый файл весит 1.9К. Ссылка: http://www.totalvacuum.ru/EF/00000002.zip |
Автор: | Total Vacuum [ Ср авг 21, 2019 17:03 ] |
Заголовок сообщения: | Re: ef \ esoteric forth \ |
Код: %c%s:k1?,=;:yf@g#q.;:ul#@q,1?t+.1+$!;:n0#l!1(1(y#'!'<&)q,'\'=#(y '\'-))ut,###'''=#{yu_}$'"'=|$'`'=|(#yu-)_l@t+!t,;:m5#+c;:w'l'ch ':'c;:ai#@$#@1+$!;:d"#"e;:v_i@wa"\"e;:r"ret"sm;:j"jmp l"shm;:z "je l"si@hma;:e':'k{_0n###j'@'cwn';'-(ten';'-)rwq+.~'%'k{_n_tp~ '''k{d"mov ax,0"s1+,b'h'cm~'"'k{d"lea ax,$+5"smi@j"db "ss",0"sma w~'`'k{#l@+1-0$.1+s~'{'k{v_z~'~'k{_i@jwa~'}'k{_w~'('k{vz~')'k{_$ jw~'['k{_i@wa" "ez~']'k{_$jw"_"e~"call @l"s,hm}}}}}}}}}}}};:pf@$ of!n(ten)f@xf!;'|'#[#q+#.]'@'#+1+##1-,+0$.1+p'a'-[#'a'+#q+,{#'@' cw"0"e"mov ah,0"s'A'-4*b'h'cmr~_}]"end"s Еще упростил транслятор, укоротил прыжковую часть. Теперь весит меньше 1.7K. Не идеал, но уже близко Еще немного и можно будет код по SMS слать P.S. Хм. А ведь это мысль. Обновление прошивки по SMS... |
Страница 2 из 15 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |