ACNews #23
17 сентября 2003

Coding - О ещё одном способе форт-подобного кодинга.

<b>Coding</b> - О ещё одном способе форт-подобного кодинга.
     ▄▄▄▄ ▄▄▄▄ ▄▄▄  ▀ ▄▄▄▄ ▄▄▄▄
■▄░  ▓  ▀ ▓  ▓ ▓  ▓ ▒ ▓  ▓ ▓ ▄▄ ▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░
  ■▀ ░▄▄░ ░▄▄▒ ░▄▄▒ ▓ ▒  ▒ ▒▄▄▒  ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀

          О ещё одном способе форт-подобного кодинга

─ Echo35 (2:5029/35.26) ────────────────────────── ZX.SPECTRUM ─
 Msg  : 447 of 547 -401      Snt Pvt Loc
 From : Dima Bystrov         2:5029/35.26    16 Jan 03  17:44:07
 To   : Nick Sevryukov                       16 Jan 03  18:41:12
 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> нежелательно! Просто он(стек) используется активно.
[skip]
 NS> Либо можно организовать по другому, только помнить, что
 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. например, так:
<plain code>
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,-а это ДРОБЬ

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

--------* Список Заслуженных Неиспользователей AC Edit *--------

1)Pawel/Real_soft Павел Кисляк 2:454/11.25
2)Kurleson/HorrorSoft Алексей Кравченко 2:5068/6
3)SirX Сергей Григорьевич Шелгинский sirx@atnet.ru
 Архангельская обл., г.Северодвинск, ул.Ж/Dорожная 35-51
 (818-4)55-10-89, 8-921-670-02-85
4)Alex_Xor/PSV Александр Дмитриевич Шушков axor@mail.ru
 (8172) 25-28-71, 160035 г.Вологда а/я 136
5)Diver/4d Алексей Голубцов orangefox@mail.ru
6)Noviset/Brutal_Creators Игорь Шахов [2:5050/109.52]

----------* Список Заслуженных Пользователей AC Edit *----------

                  Почётные и Вечные:
1)Nikphe Алексей Емельянов
 391420 Рязанская обл.,Чучковский р-н,п.Авангард,Рулезная 12
2)Mr.Event Александр Лесовский
 391420 Рязанская обл.,Чучково,ул.Калинина,26 (8-238) 7-10-73
3)CyberDemon Максим Митькин 2:5029/35.18
 Рязань,ул.Новосёлов,50к2-197
4)Basil Василий Евгеньевич Логинов 390035 Рязань,Полетаева,15-5
5)John_Silver Денис Евгеньевич Логинов там же :)
6)TS Сергей Юрьевич Тюрин triod@aport2000.ru
 390029 Рязань,Высоковольтная,16-53 (0912) 75-40-74
 8-903-640-01-49
7)U#74 Сергей Анатольевич Машин u_74@mail.ru
 443065 Самара,Пугачёвский_тракт д.66 кв.3
8)Shaitan/SoK Максим Шашкин 2:5057/21.36 (8462) 34-82-92
9)Dissonator Константин Шаев
 390048 Рязань,ул.Зубковой,19-106 (0912) 41-03-50
10)Путь Самурая Александр Голованов [aiki@mail.nnov.ru]
11)Dark Raven Семён Цехмейстер
 187500 Ленинградская обл. г.Тихвин Машиностроителей 44,кв.151
12)Disabler/DPL Андрей Горелов
 344045 Ростов-на-Дону ул.Миронова 3/3,кв.120
13)Max/Cyberax/BDA Максим Арнольд [amv@kuzbass.stack.ru]

                       Прочие:
14)Stormbringer/Cobra_Soft Valera Selev 2:462/162.7
 79022 Украина, г.Львов-22, а/я 798
15)AmoNik Николай Амосов 2:5030/978.14, 500:812/2.26 (SPbZXnet)
16)Macros Сергей Гуляев zxmsf@mail.ru
17)Jerri/AF Юрий Потапов 2:5057/21.89 (8462) 92-73-26
18)Ldir/М.П.,i8 Ярослав Турбин (0912) 77-40-37 last_128@mail.ru
 390000 г.Рязань Первомайский пр-т 40к.1,кв.18
19)Чапай/М.П. Виктор Спиридонов (0912) 76-07-36 mir_tut@mail.ru
 390029 г.Рязань ул.Строителей 1,кв.10
20)Voodoo/Delirium_Tremens Dmitry Voo vooha@ua.fm
21)Risk/O<A Сергей Николаевич Шаров 2:5054/64.24 (34241) 200-39
 617760 Пермская обл., г.Чайковский, ул.Декабристов 2-39
 lastsg@newmail.ru
22)Black_Cat/NRG Игорь Панасенко nrg_group@mail.ru
 18029 Украина, Черкассы, ул.Рустави 11,кв.76
23)C-jeff/GBG Дмитрий Олегович Жемков cjflexo@rambler.ru
24)Nik-O/TL Олег Сергевич Никитин n1k-o@yandex.ru (612) 61-49-88
 350089 г.Краснодар, ул.70 лет Октября, д.26, 109
25)КАСик/Sinclair Club Александр Станиславович Кандауров
26)MaXx/XTDM Максим Фомкин maxx_xtdm@mail.ru
 185002 р.Карелия, г.Петрозаводск, ул.Прионежская, 27
27)Pulsar/O<A Дмитрий Николаевич Патютько (34241) 239-24
 617760 Пермская обл., г.Чайковский, ул.Ленина 44-38
 pulsar-oca@newmail.ru
28)Bit/XXL Виталий Владимирович Герасимов bit-xxl@yandex.ru
 346887 Ростовская обл., г.Батайск, ул.Кулагина, 110
29)Keyser Soze/coma Андрей Пастушенко keyser_soze@inbox.ru

   Впиши своё имя среди этих Великих Людей!

     ▄▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄ ▄▄▄▄ ▄▄▄▄ ▄▄▄ ▄▄▄▄
 ░▄■ ▓  ▀ ▓  ▓ ▓  ▓  ▓  ▓▄▄▓ ▓  ▀  ▓  ▓▄▄▄ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■
▀■▄║ ░▄▄░ ░▄▄░ ░  ░  ░  ░  ░ ░▄▄░  ░  ▄▄▄░ ║▄■▀░ ■▀░ ■▀░ ■▀░ ■▀░
┌───────────────────────────────────────────── ── ─ -· ┌─o───╖ ·
│ AC Edit v0.76 supplement                             │┌╡(~)║
|  2:5029/35.26 Dima Bystrov (Alone Coder)             │╘╛(~)║
|   last_128@mail.ru (Ldir)                            ╘═════╝
·    triod@aport2000.ru Sergey Tyurin (TS)    
·     2:5029/35.18 Maxim Mit'kin (CyberDemon)    [Team ZX-Guide]



Другие статьи номера:

News - Пати (EnteR Activity 2003) должно состояться под крылом администрации города 29.

Мысли - Когда ребёнка отдают в школу, никто не спрашивает его мнения о школьной программе. Почему?

Coding - О ещё одном способе форт-подобного кодинга.


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

Похожие статьи:
От автора - наступило лето...
Железо - Схема преобразователя +5 -> +12 для питания ВГшки.
Мозаика - Что нового нам готовит Magic Soft?
Урок английского - Александр КАМНЕВ, Борис ФАЙФЕЛЬ: Урок английского.
Шведская тройка - Это была их рядовая встреча, встреча двух друзей - Саши и Вити...

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