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!




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

Похожие статьи:
Рабочий стол - Как работать с программами: Corrector v2.0.
Сказки чОрного кота - Загадочная архитектура брестского компьютера Байт, который нельзя однозначно эволюционно связать ни с одним клоном спектрума.
General Sound - Итоги опроса по GS.
Kто они? - Skinhead Against Racial Prejudices.
Paracels speaking - новости от: BrainWave, CPU, Demiurge Ash, Digital Reality, Excess, Extreme, Fenomen, Freeart.

В этот день...   8 мая