ZXNet эхоконференция «code.zx»


тема: Forth



от: Ivan Mak
кому: All
дата: 20 Apr 1999

Приветствую Вас, All!

Догожданные сабжевые файлы идут на Игоpя Гpуздева.

ZX128(1) ZIP 61 747 Фоpт для ZX-128 с исходниками
ZX48(1) ZIP 67 554 Фоpт для ZX-128 с исходниками
LZ ZIP 15 716 LZ и LZSS сжатие на фоpте
4-INT ZIP 17 313 Введение в фоpт
FIG86(1) RAR 37 210 Фоpт для оффтопика
XDEX ZIP 6 731 Идеи фоpта (C) Чеpезов А.Ю.
FORTH_CP ZIP 23 104 Книга "ФОРТ - язык для микpопpоцессоpов"

Вай! Протосы атакуют моих зерлингов! Пора сматываться. Ivan.

- Разводись схемка, больша и маленька.. ]ZX[

от: Kirill Frolov
кому: All
дата: 18 Jan 2003
=============================================================================
* Forwarded by Kirill Frolov (500:812/1.507)
* Area : ZX.SPECTRUM (Здесь эмуляторщики тусуются)
* From : Dima Bystrov, 2:5029/35.26 (16 Jan 03 17:44)
* To : Nick Sevryukov
* Subj : Re: FORTH
=============================================================================
Hello Nick!

14 Jan 03 12:58, Nick Sevryukov wrote to Valerij Kozhevnikoff:

VK>> Вот только за стеком надо следить. И потом восстановить, если
VK>> надо.
VK>> Все зависит насколько часто и как это вызывается и каким должен
VK>> быть
VK>> стек все это время.
NS> Главное, что это прога делает все нитак, как надо. Ты по сути,
NS> переписал только последнию команду jp (hl). Почитай, что я раньше
NS> писал в пояснениях к тому, как это должно работать.
NS> Этот кусочек стоит довольно часто и стек портить очень
NS> нежелательно! Просто он(стек) используется активно.

NS> ЗЫЖ Hарод мне кажется вы не до конца поняли как кусок работает?! или я
NS> торможу? этот кусочек является аналогом куска для x86 процов:
NS> lodsw
NS> mov bx, ax
NS> jmp [bx]
NS> Либо можно организовать по другому, только помнить, что есть массив с
NS> адресами, поседовательно по которым идет переход и некоторый указатель
NS> должен автоматически увеличиваться на следующий адрес(см. выше).
есть более безумная идея :)
иметь массив не с адресами, а с JP ...
в первом приближении кажется, что тут одни проигрыши, но это не так
пусть в HL будет текущий адрес (аналог (SP), но без обращения к стеку)
почему выгодно именно HL, по ходу текста будет понятно :)

"интерпретатор" выглядит так:
inc hl,hl,hl
...
jp (hl)
(+JP=18+4+10=32 такта)
(для сравнения, call+ret=27 тактов)
лучше всего inc hl,hl,hl поместить в начале подпрограммы, в jp (hl) - в конце.
если hl жизненно необходим, то можно сделать
push hl

pop hl
или (одновременно со съёмом параметра из стека)
ex (sp),hl

pop hl
или (одновременно с запихиванием результата в стек)
push hl

ex (sp),hl
(и другие вариации)

(обычным-то методом, через call-ret, довольно трудно пользоваться стеком данных
внутри подпрограммы, call-ret проигрывает около 40 тактов:
ex(sp),hl:ld(exit+1),hl:pop hl,de...exit:jp 0)

между jp-ами можно вставлять куски обычного машкода (plain code), но нужно не
забывать восстанавливать hl. например, так:

ld hl,$+6
jp kudato+3
таким образом пропускаются inc hl,hl,hl.
или даже
ld l,$+5 ;h оказалось равно старому
jp kudato+3

если считать, что по времени выполнения "интерпретатора" этот метод и
классический примерно не уступают друг другу, то тут ^^^ на этом куске plain
code мы выигрываем 8 или 11 тактов! (по длине получается проигрыш 2-3 байта)
при этом АHАЛОГИЧHО (теми же командами) можно записать даже конструкцию plain
code;call;goto! (выигрывается около 18 тактов и в среднем полбайта)

так выглядит goto в обычном случае:
jp metka
ld hl,kuda
jp (hl)
на самомо деле эта запись никогда не понадобится, т.к. случай, когда до goto
стоит plain code, мы обсудили, поэтому рассмотрим случай, когда до goto стоит
вызов:
ld hl,kuda; или ld l
jp metka+3
(не совсем логичный порядок, но написать такой компилятор можно)
тут выигрыш 8 тактов (или 11) и, если повезёт, байт.

теперь рассмотрим конктрукцию вызова с числовым параметром
в обычной жизни это ld de,param:call metka
а у нас будет
jp metka
dw param ;так можно сделать много параметров

metka
inc hl,hl,hl
ld c,(hl)
inc hl
ld b,(hl)
inc hl

(разумеется, вариант с ld тоже можно, только это редко выгодно)

условный переход можно записать так:
jp jpZ
dw kuda

jpZ
inc hl,hl,hl
jr z,jpZyes
inc hl,hl
jp (hl)
jpZyes
ld a,(hl)
inc hl
ld h,(hl)
ld l,a
jp (hl)
или, если важна скорость,
jp z,kuda
ld hl,$+3 ;или ld l,$+2

kuda
ld hl,$+3
(тут проигрыш 5-6 байт, вместо 2)

цикл с предусловием:
на обычном асме пишется так:
<...>
jp while
loop
<тело>
while
<условие>
jp cc,loop
<...>

а у нас будет (если считать, что в <...> был call metka, а в <теле> был call
metka2):
ld hl,while ;или ld l
jp metka+3
loop
ld hl,$+6 ;или ld l,$+5
jp metka2+3
<дальше тело>
while
<условие>
jp cc,loop
ld hl,$+6 ;или ld l,$+5
[call metka3+3]
(выигрыш в скорости примерно 9 тактов на каждый проход цикла, проигрыш в
размере 4-5 байт)

промежуточный результат вычислений должен лежать в de

например, выражение со сложением:
<вычисление 1-го слагаемого>
push de
<вычисление 2-го слагаемого>
pop hl
add hl,de
ex de,hl
ld hl,$+3

или с вычитанием:
<вычисление уменьшаемого>
push de
<вычисление вычитаемого>
pop hl
or a
sbc hl,de
ex de,hl
ld hl,$+3

или покороче, но медленнее (так можно записать и любую другую операцию):
<вычисление уменьшаемого>
push de
<вычисление вычитаемого>
jp subpp

subpp
inc hl,hl,hl
ex (sp),hl
or a
sbc hl,de
ex de,hl
pop hl
jp (hl)

возможно 2 спецвызова - jp (ix) и jp (iy), для чего-нибудь очень частого

в общем, это скорее не форт, а "альтернативный кодинг" ;)

- Alone Coder [ZX-Guide] [Inferno] [AlCoNews] [ACEdit] [PT] [Chip] [STS]
[ANSI] [8col] [UNRAR]

-+- GoldED/386
+ Origin: Очередь бывает в магазине,-сказал T(c)S,-а это ДРОБЬ (2:5029/35.26)
=============================================================================

Hемедленно нажми на RESET, All!




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Стихи - Вера Павлова.
Байки - Вася: хочу написАть. не знаю почему, но хочу. очень. нет сил сопротивляться. напишу.
Интервью - интервью у Борисова Миши, известного как, BOGO или BARMALEY.
От редакции - Это попытка выпустить на Спекки издание, тема которого - Хобби.
Юмор - ЗАПИСКИ ИДИОТКИ ( ИЗ ЖИЗНИ THE LEVT)

В этот день...   26 апреля