Forth http://fforum.winglion.ru/ |
|
Моя система(_KROL) http://fforum.winglion.ru/viewtopic.php?f=2&t=3127 |
Страница 9 из 36 |
Автор: | Victor__v [ Вт июл 18, 2017 20:11 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Это уже, батенька, софизм |
Автор: | _KROL [ Вт июл 18, 2017 20:13 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
У меня так: Код: ;; R> ( R: x --> S: x ; R: )
AWORD FROM_R,"R>",0 rpop ax push ax AEND ;; 2>R ( S: Dx --> S: ; R: Dx ) AWORD _2TO_R,"2>R",0 pop ax,bx xchg sp,bp ;swapx (ну, у меня макрос такой...) push bx,ax xchg sp,bp ;swapx AEND |
Автор: | chess [ Вт июл 18, 2017 21:53 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Victor__v писал(а): Это уже, батенька, софизм Ваше мнение мне стало известно. На самом деле так на форте можно написать даже другой форт(правда будет проще, если сначала на форте написать все-таки ассемблер ). |
Автор: | Victor__v [ Ср июл 19, 2017 08:11 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Цитата: На самом деле так на форте можно написать даже другой форт(правда будет проще, если сначала на форте написать все-таки ассемблер Как-то между ассемблером и записью в кодах нет особой разницы. Разве что в вашем примере надо ещё порядок следования байтов знать. Краткий справочник: Софизм - выражение содержащие противоречие или хитрая уловка. Как пример, я вегетарианец, но ем колбасу потому что колбаса это не мясо. Это реальный случай из жизни. Так и тут. Лучше реализовать на ассемблере. Как не на ассемблере? А очень просто в кодах В чём концептуальная разница между ассемблером и кодами? Её нет. Кстати, как вариант. Можно генерировать низкие исходники прямо в кодах. Что-то такое есть в СПФ у ~day |
Автор: | chess [ Ср июл 19, 2017 17:19 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Victor__v писал(а): Как-то между ассемблером и записью в кодах нет особой разницы. Разве что в вашем примере надо ещё порядок следования байтов знать. Разница конечно есть, в ассемблере например, не надо вычислять адресные смещения для команд переходов, абсолютные адреса можно заменять именами и т.д. и т.п. А порядок байтов определений в машкодах можно и не отслеживать, а выписывать байты в том порядке, в каком они стоят в инструкциях процессора: Код: : -ret; [COMPILE] [ SMUDGE ; IMMEDIATE
: code : HEX POSTPONE [ ; IMMEDIATE : endcode DECIMAL DEPTH 0 2DUP 2>R ?DO I ROLL LOOP 2R> ?DO C, LOOP ] POSTPONE -ret; ; code >r 5B \ pop ebx 50 \ push eax 8B 45 00 \ mov eax , 0 [ebp] 8D 6D 04 \ lea ebp , 4 [ebp] FF E3 \ jmp ebx endcode |
Автор: | Victor__v [ Ср июл 19, 2017 19:15 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Интересный код но логичней всё ж разбивать опкод на составные части Понятней же будет. А то вспомни через несколько лет, что число 0х23232323А0 это опкод, только читать его нужно справо-налево |
Автор: | chess [ Ср июл 19, 2017 21:47 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Victor__v писал(а): Интересный код но логичней всё ж разбивать опкод на составные части Понятней же будет. Смотрим в книгу, видим фигу. Я для кого определение >R выше приводил, там как раз опкод разбит на составные части. Можно брать коды инструкций прямо из справочника. Код: code >r
5B \ pop ebx 50 \ push eax 8B 45 00 \ mov eax , 0 [ebp] 8D 6D 04 \ lea ebp , 4 [ebp] FF E3 \ jmp ebx endcode |
Автор: | _KROL [ Чт июл 20, 2017 00:15 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Нашёл http://flop-os.fdd5-25.net/ Может когда напишу нормальный Форт, то расширю его до DOS(наверное даже до большего чем DOS)... Мечты пока однако. Сегодны EXPECT cделал. Код: : EXPECT ( buf maxsize --> asc size ) 0 ( size==0 ) BEGIN ( buf maxsize size ) KEY DUP 1C0D = \ код клавиши ENTER IF \ Если ENTER ( buf maxsize size scancode ) DROP ( buf maxsize size ) NIP ( buf size ) SWAP ( size buf ) OVER ( size buf size ) - ( size buf-size{начало буфера} ) SWAP ( asc size ) RDROP EXIT THEN DUP 0E08 = IF \ BACKSPACE? DROP DUP ( buf maxsize size size ) ?EXIT 1- ( buf maxsize size-1 ) ROT 1- ( maxsize size-1 buf-1 ) MROT ( buf-1 maxsize size-1 ) ( Допустим вот экран: ******** * C* *_ * ******** ^ если курсор здесь, то ******** * _* переместить на строку ранее * * и стареть символ C ******** ) GETXY DROP DUP IF 8 BL 8 EMIT EMIT EMIT DROP EXIT THEN ( на ассемблере у меня немного по другому...) ?DUP ?EXIT ( проверка ******** *_ * * * ******** ) 1- 0 ( y-1 0 ) GOTOXY BL EMITС EXIT THEN ( buf maxsize size keycode ) -ROT ( buf keycode maxsize size ) 2DUP = ( buf keycode maxsize size flag{maxsize==size} ) NOT ?EXIT 1+ ( buf keycode maxsize size+1 ) 2>R ( S: buf keycode R: {{RETaddr BEGINaddr}} maxsize size ) DUP EMIT ( S: buf keycode R: maxsize size ) OVER ( S: buf keycode buf R: maxsize size ) C! ( S: buf R: maxsize size byte[buf]==keycode ) 1+ 2R> ( S: buf maxsize size ) AGAIN ;; EMITC ( c --> ) ;; Вывести символ c на экран не изменяя позиции курсора. AWORD EMITC,"EMITС",0 pop ax mov ah,0xA clrf bh mov cx,1 int 0x10 AEND Код: ;; GETXY ( --> y x ) ;; Получить координаты курсора на экране AWORD GETXY,"GETXY",0 mov ah,3 clrf bh ; VP=0 int 0x10 mov bl,dh clrf dh push bx,dx AEND ;; GOTOXY ( y x --> ) ;; Установить позицию курсора на экране AWORD GOTOXY,"GOTOXY",0 mov ah,2 pop dx,bx mov dh,bl clrf bh ; VP=0 int 0x10 AEND ;; JOIN ( b a --> ba ) ;; Соеденить 2 слова в одно(?). Преобразование обратное SPLIT ;; Неопределённая ситуация: одно из значений больше размера байта. FWORD JOIN,"JOIN",0 dw SWAP,LIT,8,_SHL,_OR FEND Просто у меня есть ;; SPLIT ( word:: hl --> h l ) ;; Разделить слово на старший и младший байт AWORD SPLIT,"SPLIT",0 pop ax clr bx mov bl,ah push bx mov bl,al push bx AEND |
Автор: | Ethereal [ Пт июл 21, 2017 12:38 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
chess писал(а): Разница конечно есть, в ассемблере например, не надо вычислять адресные смещения для команд переходов, Вроде говорилось не просто про разницу, а про концептуальную разницу. Ее-то и нет. Ассемблер - это просто другая форма записи кода, а вот ЯВУ - форма записи алгоритма, а не кода.абсолютные адреса можно заменять именами и т.д. и т.п. _KROL писал(а): Код: RDROP \ Убираем адрес начала цикла и... |
Автор: | _KROL [ Пт июл 21, 2017 13:04 ] | ||
Заголовок сообщения: | Re: Моя система(_KROL) | ||
В общем-то так. Только где-то в DO-LOOP ещё ошибка... Цитата: RDROP \ Убираем адрес начала цикла и... Хотел другу обьяснить, забыл тут этот коммент убрать )
|
Автор: | Ethereal [ Пт июл 21, 2017 13:19 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Вот это место не понятно. Цитата: Код: GETXY DROP DUP IF 8 BL 8 EMIT EMIT EMIT DROP EXIT THEN ( на ассемблере у меня немного по другому...) ?DUP ?EXIT _KROL писал(а): В общем-то так. Только где-то в DO-LOOP ещё ошибка... Когда ты крутишь цикл DO LOOP при исполнении (LOOP) ты должен прыгать сразу после (DO) на первое слово тела цикла. А ты прыгаешь прямо на (DO).
|
Автор: | _KROL [ Сб июл 22, 2017 16:17 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Спасибо, я действительно ошибься. Правильно так: Код: GETXY \ DROP DUP <- Этого не надо! IF 8 BL 8 EMIT EMIT EMIT DROP EXIT THEN ( на ассемблере у меня немного по другому...) ?DUP ?EXIT ( проверка ******** *_ * * * ******** ) 1- 0 ( y-1 0 ) GOTOXY BL EMITС EXIT Цитата: Когда ты крутишь цикл DO LOOP при исполнении (LOOP) ты должен прыгать сразу после (DO) на первое слово тела цикла. А ты прыгаешь прямо на (DO). |
Автор: | _KROL [ Ср июл 26, 2017 23:08 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Тут Код: ( проверка ******** тоже ошибка!*_ * * * ******** ) 1- 0 ( y-1 0 ) <--- GOTOXY Правильно так: Код: 1- 4F ( y-1 79 ) <--- GOTOXY В общем, готовый вариант такой(на ассемблере, работает): Код: ;; EXPECT ( buf maxsize --> asc size ) ;; Считать строку с клавиатуры. ;; Для выхода из цикла ввода используйте [ENTER]. FWORD EXPECT,"EXPECT",0 dw ZERO ; ( buf maxsize size ) dw BEGIN dw KEY dw _DUP,LIT,0x1C0D,_EQ,?BRANCH,@f ; ENTER dw DROP,NIP,SWAP,OVER,_SUB,SWAP,RDROP,EXIT @@: dw _DUP,LIT,0x0E08,_EQ,?BRANCH,@f ; BACKSPACE dw DROP,_DUP,?AGAIN dw _DEC,ROT,_DEC,MROT dw GETXY,?BRANCH,.zero type 8," ",8 dw DROP,AGAIN .zero: dw ?DUP,?AGAIN dw _DEC,LIT,79,GOTOXY,_BL,EMITC dw AGAIN @@: ; ( buf maxsize size keycode ) dw MROT,_2DUP,_EQ,_NOT,?AGAIN dw _INC,_2TO_R,_DUP,EMIT dw OVER,C!,_INC,_2FROM_R dw AGAIN Если заметили, добавил ?AGAIN. Интересно то, что при maxsize=0 он будет ожидать, считай, только ENTER, что удобнее всяких readln; в Pascal. P.s. Что-то тихо на форуме. |
Автор: | Hishnik [ Чт июл 27, 2017 12:32 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
_KROL писал(а): P.s. Что-то тихо на форуме. Могу предложить начать писать Форт с ШК на Си или Паскале. Тишина пропадет. |
Автор: | gudleifr [ Чт июл 27, 2017 13:45 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
_KROL писал(а): Что-то тихо на форуме. Я тут как-то выложил готовое ядро с набором универсального доступа к Win32 API, и то, никто особо не отреагировал...С одной стороны "еще один FORTH" без соответствующей ниши никому не интересен. С другой - искать ошибки в чужих практически недокументированных исходниках - работка еще та. Тем более, пытаться понять оригинальные реализации давно затертых до дыр вещей. (Кстати, от этих же пороков страдают и все эти социалки - хабры и гитхабы, быстро превратившиеся в жуткую свалку, где невозможно найти ничего путного). |
Страница 9 из 36 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |