ACNews
#23
17 сентября 2003 |
|
Coding - О ещё одном способе форт-подобного кодинга.
▄▄▄▄ ▄▄▄▄ ▄▄▄ ▀ ▄▄▄▄ ▄▄▄▄ ■▄░ ▓ ▀ ▓ ▓ ▓ ▓ ▒ ▓ ▓ ▓ ▄▄ ▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▀ ░▄▄░ ░▄▄▒ ░▄▄▒ ▓ ▒ ▒ ▒▄▄▒ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀ О ещё одном способе форт-подобного кодинга ─ 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 - О ещё одном способе форт-подобного кодинга. |
Похожие статьи:
В этот день... 21 ноября