Forth
http://fforum.winglion.ru/

Моя система(_KROL)
http://fforum.winglion.ru/viewtopic.php?f=2&t=3127
Страница 20 из 36

Автор:  _KROL [ Сб ноя 11, 2017 12:56 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Продолжаю издеваться над кодом)
Код:
;; CALLINT ( ... n --> DI SI ВР SP BX DX СХ АХ )
;; Загрузить специальный ряд регистров, вызвать прерывание n и возвратить
;;  полученый ряд регистров.
;           0  1  2  3  4  5  6  7
; 50+n push АХ СХ DX BX SP ВР SI DI
; 58+n pop  АХ СХ DX BX SP ВР SI DI
AWORD CALLINT,"CALLINT",0
xchg sp,bp
pop ax
mov [.n],al
mov [.rp],bp
@@:
pop cx
  jcxz @f
dec cl
and cl,7
  jz .movedax
add cl,0x58 ; pop reg
mov [.popcom],al
.popcom rb 1
  jmp @b
.movedax:
pop [.dax]
  jmp @b
@@:
db 0xB8 ; mov ax,
.dax rw 1
db 0xCD ; int
.n rb 1
pusha
db 0xBD ; mov bp,
.rp rw 1
xchg sp,bp
AEND

Теперь можно делать так:
1 CONSTANT regAX
2 CONSTANT regCX
...
0 123 regAX 234 regBX 20 CALLINT
Муторно, но более универсально (0 - конец ряда данных, записываемых в регистры).

Автор:  _KROL [ Сб ноя 11, 2017 13:10 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Да, плохой подход: после этого надо отсеивать лишние возвращаемые регитстры. Куча коду - мало толку.

Вывод: лучше Форт-Ассемблера ничего нет.

Автор:  gudleifr [ Сб ноя 11, 2017 13:20 ]
Заголовок сообщения:  Re: Моя система(_KROL)

<Потерто по справедливому замечанию Victor__v>

Автор:  _KROL [ Вс ноя 12, 2017 22:05 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Решил наконец писать на SPF. Всё хорошо, но вдруг возникло исключение в данном коде (строка с применением :CODE ;CODE):
Код:
HEX
VOCABULARY K4tH ONLY FORTH ALSO K4tH DEFINITIONS
10000 CONSTANT Msz      CREATE M Msz ALLOT
100 VALUE THERE      0 VALUE TLAST      0 VALUE NLAST

: B,  M THERE + C! THERE 1+    TO THERE ;
: W,  M THERE + W! THERE 2+    TO THERE ;
: D,  M THERE +  ! THERE 2+ 2+ TO THERE ;

: NEXT,
AD B,   \ lodsw
C389 W, \ mov bx,ax
27FF W, \ jmp word[bx]
;

: NFA, PARSE-NAME DUP B, DUP ( addr sz sz )
THERE SWAP OVER + ( addr sz there there+sz )
TO THERE SWAP CMOVE
;

: LFA, TLAST @ W, ;

: :CODE THERE DUP TO NLAST
NFA, LFA, THERE 2+ W,
CREATE , DOES> @ W,
;

: ;CODE NEXT, NLAST TO TLAST ;

:CODE BRANCH 348B W, ;CODE \ mov si,[si]

\ : :: ... ;
\ : ;; ... ;

\ Сохранение образа системы

0 VALUE fhnd
: SAVE"
[CHAR] " WORD COUNT W/O CREATE-FILE DROP TO fhnd
M THERE 100 - fhnd WRITE-FILE DROP
fhnd CLOSE-FILE DROP
BYE
;

SAVE" K4tH.COM"
Подскажите пожалуйста в чём ошибка!

Автор:  _KROL [ Вс ноя 12, 2017 23:06 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Эх, проблема в слове NFA, в месте CMOVE
Исправляюсь...


Исправил:
Код:
: NFA, PARSE-NAME DUP B, DUP ( addr sz sz )
THERE + ( addr sz there+sz )
TO THERE M SWAP 3 .SN KEY DROP CMOVE
;
Всё равно не работает((

Автор:  Victor__v [ Пн ноя 13, 2017 17:26 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Пара моментов.
В СПФ есть чудесное слово +! \ zn addr
Переопредели THERE в VARIABLE . Возни будет меньше.
Во вторых, в СПФ есть слово S, - скомпилировать строку в кодофайл.
Определи подобное слово у себя для ЦК.
Тогда NFA,
будет выглядить так:
Цитата:
: NFA, PARSE-NAME >R
R@ B,
R@ S,
R> THERE +!
;

Автор:  _KROL [ Пн ноя 13, 2017 21:29 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Да, перед CMOVE я случайно вставил (это я нашёл для отладки):
Код:
3 .SN KEY DROP

Проблема в CMOVE, а не в THERE. Когда оно у меня исполняется, то вылетает исключение,
хотя M я нормально подставил (ведь оно возвращает адрес буфера?).
А как без CMOVE сделать S, ?

Автор:  _KROL [ Пн ноя 13, 2017 21:38 ]
Заголовок сообщения:  Re: Моя система(_KROL)

УРА! Ошибка тут:
Цитата:
: LFA, TLAST @ W, ;

Ну и SPF! Прямо как и Visual Studio указывет не на то, что надо)
Сегодня помню у кого-то не работала одна программа, визжалка выдавала куча ошибок, а в итоге оказалось, что нечаянно посреди исходников (между описания методов, вроде) торчало одно несчастное "g" :))

Victor__v писал(а):
Переопредели THERE в VARIABLE . Возни будет меньше.
Спасибо за совет! Я думаю и ошибок :)

Автор:  Victor__v [ Пн ноя 13, 2017 22:38 ]
Заголовок сообщения:  Re: Моя система(_KROL)

_KROL писал(а):
Да, перед CMOVE я случайно вставил (это я нашёл для отладки):
Код:
3 .SN KEY DROP

Проблема в CMOVE, а не в THERE. Когда оно у меня исполняется, то вылетает исключение,
хотя M я нормально подставил (ведь оно возвращает адрес буфера?).
А как без CMOVE сделать S, ?


Проблема не в CMOVE .
С переносом строк просто трудно работать.
Вот код. THERE тут уже VARIABLE
Код:
: S,
>R
M THERE @ + R@ CMOVE
R> THERE +!
;



Автор:  _KROL [ Пн ноя 13, 2017 22:45 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Ага, понятно. Но всё-равно код у меня ещё почему-то не компилирует значения, хоть и резервирует место. Позже выложу нормальную версию (может и не сегодня)...

Автор:  Victor__v [ Пн ноя 13, 2017 22:48 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Если я правильно понял, то :CODE создаёт в твоём массиве новое слово и берёт кол-во параметров со стека данных?
Но вот проблема.
У тебя будет ссылка на СПФ-кий CREATE-CODE (или что там?) и остаток кода после DOES> в СПФ!

Лучше заведи слово HEADER
Пусть оно скомпилирует все твои поля и флаги. А с телом ты асме справишься

Автор:  _KROL [ Пн ноя 13, 2017 23:03 ]
Заголовок сообщения:  Re: Моя система(_KROL)

Нет, :CODE создаёт новое слово и в целевом (понятно для чего) и в обычном словаре, чтобы потом можно было делать так:
Код:
:CODE NOP ;CODE
:: abc \ как и :CODE, только для высокоуровневых слов
NOP \ компилирует NOP из целевого словаря
;;


Зачем одно HEADER? Слова то двух типов, соответственно CFA указывает на разное.
У меня не так то много полей.

P.s. Основываюсь на идеях из исходников Дмитрия Понятова(forth@km.ru), но пишу по своему.

Автор:  gudleifr [ Вт ноя 14, 2017 00:14 ]
Заголовок сообщения:  Re: Моя система(_KROL)

<Потерто по справедливому замечанию Victor__v>

Автор:  Victor__v [ Вт ноя 14, 2017 01:05 ]
Заголовок сообщения:  Re: Моя система(_KROL)

_KROL писал(а):
Нет, :CODE создаёт новое слово и в целевом (понятно для чего) и в обычном словаре, чтобы потом можно было делать так:
Код:
:CODE NOP ;CODE
:: abc \ как и :CODE, только для высокоуровневых слов
NOP \ компилирует NOP из целевого словаря
;;


Зачем одно HEADER? Слова то двух типов, соответственно CFA указывает на разное.
У меня не так то много полей.

P.s. Основываюсь на идеях из исходников Дмитрия Понятова(forth@km.ru), но пишу по своему.


Эх, а я создавал интерпретатор входного потока при компиляции, который берёт из целевого словаря. Ест-но после всех необходимых низкоуровневых определений. А для некоторых случаев ( ['] [char] begin if и пр. ) создавал отдельный словарь и брал уже слова из него

Автор:  _KROL [ Вт ноя 14, 2017 18:12 ]
Заголовок сообщения:  Re: Моя система(_KROL)

gudleifr писал(а):
_KROL писал(а):
Основываюсь на идеях из исходников Дмитрия Понятова
А зачем Вам еще и его ошибки, в дополнение к Вашим?
Forth может получится только если
1. Вы в совершенстве владеете языком машины, для которой его пишете
2. Есть задача, которую иначе не решить
Если, хотя бы, одно из условий не выполняется, получится, в лучшем случае, "эмулятор FORTH", который Вы просто положите на полку.

Ну надо же с чего то начинать учиться, ведь не так легко слёту программировать на Sp-Forth, не так ли? Тем более, что каждый Форт своеобразен.

Страница 20 из 36 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/