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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 536 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9, 10 ... 36  След.
Автор Сообщение
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Пт июл 07, 2017 10:45 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
А вообще, у меня есть вопросы:
1. Что означает M в названиях имён некоторых математических функций?
Пример из F94
Код:
M+                           "m-plus"                       DOUBLE
            ( d1|ud1 n -- d2|ud2 )
            Прибавляет n к d1|ud1, возвращая сумму d2|ud2.
Типа то, что n переводится в двойное слово?
Ответ:
Цитата:
Без буквы или с буквой U (беззнаковые) - операнды одинарной точности (ячейка сеll).
С буквой D или DU (если беззнаковые) - операнды двойной точности (двойная ячейка double cell).
С буквой M (mixed) - смешаны между собой операнды одинарной и двойной точности.

2. Я хоть занимаюсь в правильном направлении? (комментарии и т.д.)
3. Правильно ли:
Код:
* ( b a --> b*a )
M* ( b a --> dword:: b*a )
/MOD ( b a --> b/a b%a )
U/MOD ( uword: b a --> uword: b/a b%a )
M/MOD ( Db a --> dword:: b/a word:: b%a )
UM/MOD ( Dx y --> udword:: Dx/y uword:: Dx%y )
: */MOD ( c b a --> Dt=c*b --> dword:: Dt/a word:: Dt%a ) >R M* R> M/MOD ;
: U*/MOD ( c b a --> Dt=c*b --> dword:: Dt/a word:: Dt%a ) >R M* R> UM/MOD ;
\ Приставка D - DOUBLE

4. Что делать с делением 32-битного числа на 16-битное(вариант 8086)?
К примеру
Код:
org 0x100
mov dx,0x1000
mov ax,dx
mov bx,2
div bx
ret
в TD у меня возвращает "Terminated, exit code 256". Что делать???
...(продолжение ниже)


Последний раз редактировалось _KROL Вс июл 09, 2017 13:25, всего редактировалось 10 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Пт июл 07, 2017 23:03 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Да очень просто.
Без буквы или с буквой U (беззнаковые) - операнды одинарной точности (ячейка сеll).
С буквой D или DU (если беззнаковые) - операнды двойной точности (двойная ячейка double cell).
С буквой M (mixed) - смешаны между собой операнды одинарной и двойной точности.
В твоем случае сложение cell и double cell.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Пт июл 07, 2017 23:21 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Хорошо, удалил, как не актуал.

З.Ы.
Ну а если это boot-сектор, тогда начало
xor ax,ax
mov ss,ax
mov sp,7C00h
mov ds,ax

ибо большинство BIOS-ов передает управление на 0:7C00 , но есть и такие, что на 7C0:0
, т.е. mov ax,cs mov ds,ax mov ss,ax, как у тебя, может дать ds=ss=0 , но может и ds=ss=7C0h

Причем именно в таком порядке, ибо если написать mov ds mov ss mov sp, то на ранних процессорах mov ds УЖЕ запретит прерывания на 1 команду, а тогда mov ss уже их НЕ запретит. Т.е. непосредственно перед парочкой mov ss mov sp не должно быть команды записи в сегментный регистр и именно при таких условиях прерывание после mov ss и перед mov sp гарантированно не произойдет безо всяких cli и sti.

Вот такие вот тут нюансы.

З.З.Ы
Цитата:
FWORD _2DUP ; ( DWORD:: x --> x x )
dw OVER,OVER
FEND

FWORD _3DUP ; ( c b a --> c b a c b a )
dw OVER,OVER
FEND
Почему 3DUP ведет себя как 2DUP ?

З.З.З.Ы.
Цитата:
;; ?KEY ( --> flag{TRUE: scancode flag|FALSE: flag} )
;; Возвратить состояния клавиатуры (нажата ли клавиша; если да, то и её код).
AWORD KEY?
clr al
inc al
int 0x16
xor ax,ax
jz @f
dec ax
@@:
push ax
AEND
Ну писал же, что xor ax,ax выставляет флаг Z всегда.

З.З.З.З.Ы
Цитата:
AWORD UDIVIDE ; ( Uword:: b a --> b/a b%a )
pop bx,ax
cwd
div bx
push ax,dx
AEND
cwd когда знаковое деление idiv. А когда беззнаковое div тогда xor dx,dx


Последний раз редактировалось Ethereal Сб июл 08, 2017 05:47, всего редактировалось 10 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Сб июл 08, 2017 00:03 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
А ты это видел?
Цитата:
1. Самостоятельная система (пока 16 бит)
2. Сборкой дискеты занимается FASM (только раскоментируйте в конце __toimg__)

Да и 55AA в конце BOOTSECTORа...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Сб июл 08, 2017 05:37 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Удалил мое замечание не к месту и вместо него навтыкал те, что к месту.

З.Ы. Чем выкладывать сыроватые версии своей системы, написал бы какую-нибудь игрушку на своем Форте. Пока пишешь, Форт по ходу дела неизбежно отладишь. На практике отладишь. По крайней мере косяк с ?KEY сразу вылезет и не о чем будет спорить. Если нет идеи какая игрушка, вот, к примеру Сокобанчик в текстовом режиме напиши. Лабиринты (90 штук) можешь дерануть из моего старого минималистичного Сокобанчика, который я написал еще будучи студентом. В текстовом режиме 40*25. Приаттачиваю. Я когда Паскаль и ассемблер изучал написал на них сокобанчики, а когда Си наваял пентикс, точнее роликс (пентикс с постоянным проворотом стакана, от чего такое название и придумал), вот только живой экземпляр того роликса затерялся. А вот сокобанчик на пыльной дискетке нашелся.
Инструксьон : Стрелками вправо-влево выбираем номер лабиринта, а потом пробел. Пробелом же можем из него в любой момент выйти, а выход из программы Esc. Двигаем человечка стрелками, забоем можно откатить назад один неверный толчок блока, но только один. Когда лабиринт разобран, человечек пропадает, тут нажать пробел, получить поздравления и еще раз пробел. Изюминка сокобанчика в том, что рекорды (главный приоритет - минимум сдвигов блоков/бриллиантов, вторичный - минимум шагов человечка) сохраняются в само тело EXE-программы. Причем, сжатой с помощью LZEXE программы. Т.е. сокобанчик свою историю помнит. :) Он уже какие-то рекорды помнит :)


Вложения:
SOKOBAN.rar [7.24 Кб]
Скачиваний: 436
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Сб июл 08, 2017 16:14 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Цитата:
xor ax,ax
mov ss,ax
mov sp,7C00h
mov ds,ax
Спасибо, не знал!
---
Да, я там не заметил(просто порою переписываю вручную :] ). Придумал такой вариант:
: 3DUP ( c b a --> c b a c b a ) >R 2DUP R@ -ROT R> ;
---
Змейка пойдёт? ;) (только сделаю под DOS)
---
P.s. Кстати, спасибо Gudleifr за
Цитата:
А теперь (еще раз) посмотрим правильный ответ (на FORTH-форуме) - http://gudleifr.forum2x2.ru/t29-topic
Мне просто http://www.gudleifr.h1.ru[опять не работает] не понравился по виду(да и последний, если чесно, не очень)... Так что не выгоняйте его из сайта.

P.s. Нашёл только что где-то тут, на форуме, ссылку на хорший форт(x64): http://t0.esy.es.


Последний раз редактировалось _KROL Вс июл 09, 2017 13:26, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс июл 09, 2017 03:47 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
3. Правильно ли:
Код:
/MOD ( b a --> b/a b%a )
Бросается в глаза - после /MOD на вершине стека частное, а под ним остаток. Так-что
/MOD ( b a --> b%a b/a )
Это и к другим твоим /MOD также относится.
_KROL писал(а):
: */MOD ( c b a --> Dt=c*b --> dword:: Dt/a word:: Dt%a ) >R M* R> M/MOD ;
: U*/MOD ( c b a --> Dt=c*b --> dword:: Dt/a word:: Dt%a ) >R M* R> UM/MOD ;
Ага, а вот тут вылезает тонкий нюанс. Дело в том, что когда ты умножаешь два числа размером x бит и получаешь произведение также размером x бит, то нет разделения на знаковое и беззнаковое умножения, потому-что в обоих случаях результат будет одинаков.
Например пусть x = 16 и ты умножаешь знаковые -1 на -1. Тогда результат есс-но 1.
Но если те-же числа понимать беззнаковыми, то это будет умножение FFFF на FFFF и по идее результат должен быть FFFE0001 , но если он усекается до x = 16 бит, то опять получается 0001. Т.е. что знаковое, что беззнаковое умножения без увеличения разрядности для произведения дают один и тот-же результат. Это плюс. Но иногда результат такого умножения неверен (пример: FFFF * FFFF усеклось, превратилось из FFFE0001 в единицу и стало неверным). Это минус. Есть плюс и есть минус. А при другом подходе будет минус и будет плюс. Поэтому однозначного выбора какое умножение делать (с удвоением разрядности для произведения или без него) нет. От этого в Форте есть и то и то.
Итак, в Форте есть умножение без увеличения разрядности * и оно одно для знаковых и беззнаковых, и это хорошо, но оно не всегда дает верный результат и это плохо. Программист должен сам следить, чтобы операнды для умножения * не стали слишком большими и это умножение не соврало.
Теперь второй случай - если ты хочешь такое умножение, чтобы результат был ВСЕГДА верен. Тогда тебе придется удваивать разрядность для произведения. Перемножаешь 16-битные , а результат тогда 32-битный. Но в таком случае знаковое и беззнаковое умножения дадут разные результаты, что видно уже из примера выше. Поэтому в Форте два таких умножения M* и UM* . Так вот в */MOD надо применить M* , а в U*/MOD тогда уже UM* , а у тебя последнее не так.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс июл 09, 2017 04:34 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
К примеру
Код:
org 0x100
mov dx,0x1000
mov ax,dx
mov bx,2
div bx
ret
в TD у меня возвращает "Terminated, exit code 256". Что делать???
...(потом будут)
Ты делишь 0x10001000 на 2. Частное должно быть помещено в регистр AX размером в слово, но оно не влезает в слово и от этого команда div выкидывает int 0 (переполнение при делении). То-же самое прерывание, что и при делении на ноль.
В стандарте ANSI сказано по этому поводу
Код:
;   UM/MOD                     CORE
;   ( ud u1 -- u2 u3 )
;   Делить ud на u1, получить частное u3 и остаток u2.
;   Все значения и арифметика беззнаковые.
;   Исключительная ситуация возникает, если u1 ноль или частное
;   находится вне диапазона одинарных беззнаковых чисел.
Исключительная ситуация. Делай с ней что хош. Можешь перехватывать в своем Форте прерывание int 0 и делать так, чтобы Форт ругался, но не валился. А можешь наплевать и забыть, тогда поделившую на ноль Форт-программу придется критиковать по Ctrl-Alt-Del. :D


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс июл 09, 2017 13:25 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Вопросы(продолжение):
3. А так вроде правильнее:
Код:
M* ( b a --> dword:: b*a )
UM* ( uword: b a --> udword:: b*a )
: * ( b a --> b*a ) M* NIP ;
: U* ( uword:: b a --> b*a ) UM* NIP ;
M/MOD ( Db a --> b%a dword:: b/a )
UM/MOD ( U:: Dx y --> Dx%y udword:: Dx/y )
: /MOD ( b a --> b%a b/a ) SWAP S>D ROT M/MOD NIP ;
: U/MOD ( uword: b a --> b%a b/a ) SWAP S>D ROT UM/MOD NIP ;
: */MOD ( c b a --> Dt=c*b --> Dt%a dword:: Dt/a ) >R M* R> M/MOD ;
: U*/MOD ( U:: c b a --> Dt=c*b --> Dt%a udword:: Dt/a ) >R UM* R> UM/MOD ;
\ Приставка D - DOUBLE


4. Что делать с делением 32-битного числа на 16-битное(вариант 8086)?
Ответ:
Цитата:
Ты делишь 0x10001000 на 2. Частное должно быть помещено в регистр AX размером в слово, но оно не влезает в слово и от этого команда div выкидывает int 0 (переполнение при делении). Исключительная ситуация.

Я конечно об этом как-нибудь подумаю. А то опять возвращается то чуство, когда я хотел портировать мой 16-битный форт под 8080(для своего эмулятора)! Буду использовать инструкции 80286/386 :)
Вот как это решено в PC-FORTH:
Код:
mmdiv:
   pop ax      ; делить d на w
   mov ecx,0   ; получить результат d и остаток w
   add cx,ax
   pop eax
   mov edx,0
   div ecx
   push eax
   push dx
   jmp next

Доступна новая версия, там и смотрите мою реализацию...


Вложения:
Комментарий к файлу: Ладно, может кого заинтересует? Полную точность выполнения команд не гарантирую(вдруг опять что-то не заметил). [для PABC]
8080EMU.zip [3.87 Кб]
Скачиваний: 453
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс июл 09, 2017 22:38 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
_KROL писал(а):
: * ( b a --> b*a ) M* NIP ;
: U* ( uword:: b a --> b*a ) UM* NIP ;
: * ( b a --> b*a ) M* DROP ;
: U* ( uword:: b a --> b*a ) UM* DROP ;
Двойные целые в Форте лежат на стеке так, что на вершине стека оказывается старшая половина. От сего легко превращать двойное целое в одинарное и наоборот. И не только. Можно одинарное превратить в тройное, четверное и обратно. И все это легко, поскольку самая старшая ячейка числа всегда на вершине стека.
_KROL писал(а):
: /MOD ( b a --> b%a b/a ) SWAP S>D ROT M/MOD NIP ;
: U/MOD ( uword: b a --> b%a b/a ) SWAP S>D ROT UM/MOD NIP ;
S>D - расширение знака целого на вершине стека. : S>D DUP 0< IF -1 ELSE 0 THEN ; , т.е. это слово заполняет знаковым битом числа с вершины стека ячейку и кладет ее на стек, распространяя знак, расширяя знак. Оно превращает знаковое одинарное в знаковое двойное. А вот беззнаковое одинарное превращается в беззнаковое двойное простым приставлением нуля. Например пусть на стеке FFFF. Если оно знаковое, то это -1 и оно превращается в двойное -1, которое выглядит как FFFF FFFF. S>D для этого и распространит знаковый бит, расширит знак, положив на стек FFFF. А вот если оно беззнаковое, то FFFF расширяется до 0000 FFFF , причем 0000 на вершине стека, а FFFF под ним, т.е. расширение беззнакового происходит тупым уложением на стек нуля.
Поэтому
: /MOD ( b a --> b%a b/a ) SWAP S>D ROT M/MOD DROP ;
: U/MOD ( uword: b a --> b%a b/a ) 0 SWAP UM/MOD DROP ;

З.Ы, Пусть у тебя одинарное число на вершине стека, а ты хочешь сделать его четверным. Тогда если оно знаковое, то делаешь S>D S>D S>D , а если беззнаковое то 0 0 0 . А для обратного преобразования делаешь 2DROP DROP


Последний раз редактировалось Ethereal Вс июл 09, 2017 23:14, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс июл 09, 2017 23:13 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Ethereal писал(а):
Двойные целые в Форте лежат на стеке так, что на вершине стека оказывается старшая половина.
А я так не хочу! :( Ну ладно :? Спасибо, не знал! (завтра поправлю, скоро спать буду)
Так что, они(Hishnik и т.д.) будут когда-нибудь делать свой стандарт?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс июл 09, 2017 23:19 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Не хочешь - делай как хочешь. Только тогда оговаривай, чтобы другие фортеры тебя понимали.
Ну тогда только определение U/MOD переделай. S>D там неуместно.


Последний раз редактировалось Ethereal Вс июл 09, 2017 23:20, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс июл 09, 2017 23:20 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Цитата:
Ну тогда только определение U/MOD переделай. S>D там неуместно.

Хорошо!

P.s. Кстати, я свой эмулятор делал не через case... ;)
Подожди...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Вс июл 09, 2017 23:26 
Не в сети

Зарегистрирован: Пт янв 06, 2017 14:57
Сообщения: 365
Благодарил (а): 17 раз.
Поблагодарили: 1 раз.
Вот, даже когда-то сделал 4th на PABC...
PABC не вмещается :(
Цитата:
Слишком большой размер вложения.
Максимальный разрешенный размер: 3 Мб.


Дело в том, что я люблю массивы процедур в PABC. Это конечно не выгодно в другой среде, но там и так всё другое ограничено(явно типы, к примеру, нельзя изменить).

Ты тут будешь что-нибудь писать? Если нет, через 3 минуты ухожу :)
: MAIN Время.Минуты
BEGIN
DUP Время.Минуты - 3 = ( timeflag)
Будешь_писать? NOT ( timeflag eventflag)
OR UNTIL ;
\ ОЙ! Что-то увлёкся :)) Пойду...


Вложения:
PABC4th.zip [3.59 Кб]
Скачиваний: 373
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Моя система(_KROL)
СообщениеДобавлено: Пн июл 10, 2017 00:10 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Да ну нафиг, это в армии за 45 секунд одеться, а вот норматива за 3 минуты найти ошибки в чужом исходнике никто не устанавливал :D Короче, и рад бы что сказать, да сказать нечего :D


Последний раз редактировалось Ethereal Пн июл 10, 2017 00:11, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 536 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9, 10 ... 36  След.

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


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

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


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

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