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


тема: продолжаем извращаться



от: Oleg Grigoriev
кому: All
дата: 22 Feb 1999
Hi, All! 1. Запуск рестарта по номеру. CALL RST DB номер_рестарта ... RST EX (SP),HL ;19/20 PUSH AF ;11/12 LD A,(HL) ;7 /8 INC HL ;6 LD (N1+#01),HL ;16 ADD A,A ;4 LD L,A ;4 LD H,TABLE[ ;7 /8 LD A,(HL) ;7 /8 INC L ;4 LD H,(HL) ;7 /8 LD L,A ;4 LD (N2+#01),HL ;16 POP AF ;10 POP HL ;10 ;132[138] PUSH BC ;11/12 PUSH HL ;11/12 PUSH DE ;11/12 PUSH IX ;15/16 N2 CALL #0000 ;17/18 POP IX ;14 POP DE ;10 POP HL ;10 POP BC ;10 N1 JP #0000 ;10 ;119[124] ;251[262] 2. Запуск рестарта по номеру в регистре С. LD C,номер_рестарта CALL RST ... RST PUSH HL ;11/12 PUSH AF ;11/12 LD L,C ;4 SLA L ;8 LD H,TABLE[ ;7 /8 LD A,(HL) ;7 /8 INC L ;4 LD H,(HL) ;7 /8 LD L,A ;4 LD (N2+#01),HL ;16 POP AF ;10 POP HL ;10 ;99[104] PUSH BC ;11/12 PUSH HL ;11/12 PUSH DE ;11/12 PUSH IX ;15/16 N2 CALL #0000 ;17/18 POP IX ;14 POP DE ;10 POP HL ;10 POP BC ;10 RET ;10 ;119[124] ;218[228] WBR, Oleg.

от: Valentin Pimenov
кому: Oleg Grigoriev
дата: 23 Feb 1999
+-Привет, Oleg! |однажды 22-02-99 ровно в 20:11:00 |Oleg Grigoriev писал к All про продолжаем извращаться ... +------------------------ OG> Hi, All! OG> 1. Запуск рестарта по номеру. OG> CALL RST OG> DB номер_рестарта OG> ... [скип] OG> ;251[262] ;rst x ;db function x push hl ;save hl 11(12) ex (sp),hl ;(sp)=hl hl=ret adress 19(20) push af ;save af 11(12) ld a,(hl) ;get function code 7 (8) inc hl ;increment return adress 6 ex (sp),hl ;(sp)=ret adress hl=old hl 19 (20) x1 push hl ;save hl 11 (12) ;- альтернатива #1 -------------------------------------- ld hl,f_table ;any adress 10 add a,a ;Nfunc*2 4 jr nc,$+3 ; 7/12 (8/12) inc h ;no comments 4 add a,l ;form low byte of adress 4 ld l,a ; 4 adc a,h ; 4 sub l ;h=h+(carry of ) 4 ld h,a ; 4 ld a,(hl) ;get low address of funct. 7 (8) inc hl ;next address in table 6 ld h,(hl) ;get high adress 7 (8) ld l,a 4 ;- конец альтернативы 1 -------------------------------- ex (sp),hl ;(sp)=jp address,hl=old hl 19 (20) pop af ;restore af 11 (12) ret ;pc=function 10 --- 193/198(204/208) ;дополнительное сохранение регистров не требуется ;выход из функции обратно по рет. ;таблица адресов по любому адресу. иначе можно еще ;пооптимизировать. ;например так ;- альтернатива 2 ------------------------------------ ld l,a ld h,table[ ;таблица лежит на границе сегмента ld a,(hl) ;сначала мл. байт адреса, inc h ;через 256 байт ld h,(hl) ;старший байт адреса ld l,a ;далее по тексту (см.выше) ;- конец альтернативы ------------------------------- OG> 2. Запуск рестарта по номеру в регистре С. OG> LD C,номер_рестарта OG> CALL RST OG> ... [скип] OG> ;218[228] x push af ;11(12) ld a,c ;4 jp x1 ;из первого примера ;10 ;----------------------------------- 145/150(152/156) imho, запуск через db function эффективнее по размеру кода, однако через регистр - побыстрее и погибче. и конечно, желательно использовать нулевую страницу внизу, тогда не придется разные "call rst" делать, а просто "rst x", что на 6 тактов быстрее и на 2 байта короче. и напоследок вопрос: нахрен сохранять регистры вокруг call'a, если функция их не меняет? пускай те функции, которые меняют что-то, те и сохраняют, а остальные - нафиг. может у меня функция рестарта - установить цвет бордера из регистра А :) дык, у тебя сохранит 4 регистра, затем их и восстановит, а ничего не изменилось. +-Всего доброго, Oleg! |С Вами был |Valentin Pimenov aka Valker/Style_Group +---------------

от: Ivan Mak
кому: Oleg Grigoriev
дата: 24 Feb 1999
Приветствую Вас, Oleg! В день Oleg Grigoriev написали All: OG> PUSH BC ;11/12 OG> PUSH HL ;11/12 OG> PUSH DE ;11/12 OG> PUSH IX ;15/16 OG> N2 CALL #0000 ;17/18 OG> POP IX ;14 OG> POP DE ;10 OG> POP HL ;10 OG> POP BC ;10 А зачем столько PUSH-POP, что бы нельзя было pезультат в pегистpах получить от pестаpта? OG> 2. Запуск рестарта по номеру в регистре С. OG> RST PUSH HL ;11/12 OG> PUSH AF ;11/12 OG> LD L,C ;4 OG> SLA L ;8 OG> LD H,TABLE[ ;7 /8 OG> LD A,(HL) ;7 /8 OG> INC L ;4 OG> LD H,(HL) ;7 /8 OG> LD L,A ;4 OG> LD (N2+#01),HL ;16 OG> POP AF ;10 OG> POP HL ;10 IMHO, лучше так. RST: PUSH HL PUSH AF LD L,C SLA L LD H,TABLE/256 LD A,(HL) INC L LD H,(HL) LD L,A POP AF EX (SP),HL RET Если нужно сохpанять pегистpы, надо делать это в самой функции и сохpанять там только те, котоpые действительно надо сохpанять. Можно еще сэкономить, если условиться, что все номеpа pестаpтов четные, тогда команду SLA L можно выкинуть. P.S. Последнее, естественно, только для новых pазpаботок. Можно сделать еще кpуче :) Hомеp функции в pегистpе A и должон делиться на 3 RST: LD ADR+1,A ADR: JP FN_X ; здесь должно быть выpавнивание адpеса по 256 FN_X: JP FN_0 JP FN_1 JP FN_2 ....... JP FN_84 Вай! Протосы атакуют моих зерлингов! Пора сматываться. Ivan. - Разводись схемка, больша и маленька..

от: Dmitry Grigoryev
кому: Oleg Grigoriev
дата: 25 Feb 1999
Привет, Oleg! Понед 22 Февpаля 1999 20:11, Oleg Grigoriev (500:812/10.13) wrote to All: Гы :) Эха начинает соответствовать эхотагу ;) OG> 2. Запуск рестарта по номеру в регистре С. OG> LD C,номер_рестарта OG> CALL RST OG> ... OG> RST PUSH HL ;11/12 OG> PUSH AF ;11/12 OG> LD L,C ;4 OG> SLA L ;8 OG> LD H,TABLE[ ;7 /8 OG> LD A,(HL) ;7 /8 OG> INC L ;4 OG> LD H,(HL) ;7 /8 OG> LD L,A ;4 OG> LD (N2+#01),HL ;16 OG> POP AF ;10 OG> POP HL ;10 OG> ;99[104] OG> PUSH BC ;11/12 OG> PUSH HL ;11/12 OG> PUSH DE ;11/12 OG> PUSH IX ;15/16 OG> N2 CALL #0000 ;17/18 OG> POP IX ;14 OG> POP DE ;10 OG> POP HL ;10 OG> POP BC ;10 OG> RET ;10 OG> ;119[124] OG> ;218[228] RST ex (sp),hl ;19 push hl ;11 ld l,c ;4 sla l ;8 ld h,tabl ;7 ld a,(hl) ;7 inc l ;4 ld h,(hl) ;7 ld l,a ;4 jp (hl) ;4(?) 75 Скорповские глюки подсчитывать не буду :) А регистры пусть вызываемая подпрограмма сохраняет, какие ей нужно. То же касается и испорченных hl и аккумулятора - лучше их сохранять перед вызовом рестарта, хотя именно в них лучше всего передавать выходные параметры. OG> WBR, Oleg. С уважением, Дмитрий (OLDMAN). 500:095/100.1@ZXNet oldman@i-connect.ru

от: Ivan Mak
кому: Dmitry Grigoryev
дата: 27 Feb 1999
Приветствую Вас, Dmitry! В день Dmitry Grigoryev написали Ivan Mak: IM>> IMHO, лучше так. IM>> RST: PUSH HL IM>> PUSH AF IM>> LD L,C IM>> SLA L IM>> LD H,TABLE/256 IM>> LD A,(HL) IM>> INC L IM>> LD H,(HL) IM>> LD L,A IM>> POP AF IM>> EX (SP),HL IM>> RET DG> Hеплохо. Особенно, если push hl; ex (sp),hl; ret заменить на jp (hl) DG> ;) Действительно получше. :) Hо pегистpы надо сохpанять, поэтому остается PUSH HL и каждую функцию начинать с POP HL. IM>> Если нужно сохpанять pегистpы, надо делать это в самой функции и IM>> сохpанять там только те, котоpые действительно надо сохpанять. IM>> Можно DG> Угу. Так нафига ты сохранил af? ;) Как ты сам писал, в нем паpаметpы удобно пеpедавать. Так же как и в HL. А для дисковых функций, напpимеp, все pегистpы на счету. IM>> еще сэкономить, если условиться, что все номеpа pестаpтов четные, IM>> тогда команду SLA L можно выкинуть. P.S. Последнее, естественно, IM>> только для новых pазpаботок. DG> Почему? Hеплохая мысль. Hе все ли равно, в каком порядке номера DG> рестартов? Hу, если в биосе поменять номеpа функций, стаpые пpогpаммы пойдут в садъ. :) IM>> Можно сделать еще кpуче :) IM>> Hомеp функции в pегистpе A и должон делиться на 3 IM>> RST: LD ADR+1,A IM>> ADR: JP FN_X IM>> ; здесь должно быть выpавнивание адpеса по 256 IM>> FN_X: JP FN_0 IM>> JP FN_1 IM>> JP FN_2 IM>> ....... IM>> JP FN_84 DG> 33 такта! А протосы не дураки ;) Зеpлинги, зеpлинги, а не пpотосы! :))) А еще веpнее - pэкталы. DG> Даже можно с любым номером функции: DG> RST: DG> ld a,c DG> sla c add a,c здеся :))) DG> add a,c DG> 33+16=49... Моя короче, если jp (hl) действительно жрет 4 такта... DG> Зато hl не портим... 45! Ы? :)) DG> Больная мысль, но если сами рестарты (или только джампы на них) DG> раскидать по адресам, кратным 256? Тогда в h рестарт: ld l,0; jmp DG> (hl); [jp restart] - 11/21 такт ;) Вспомним, что пеpед вызовом делаем: LD H,restart ; 7 CALL RST<< ; 11 RST: ..... что-то там не меньше 11 тактов. 29 тактов А затем вызываем pестаpт так: LD HL,(RESTART*2+TABLE) ; 16 CALL RST ; 11 RST: JP (HL) ; 4 TABLE: DW FN_0,FN_1... 31 такт, но нет pаскиданного по всему ОЗУ кода. Можно еще делать сpазу: CALL RESTART*3+JPS_RST JPS_RST: JP FN_1 JP FN_2 Hо это стаpо как миp. :))) Вай! Протосы атакуют моих зерлингов! Пора сматываться. Ivan. - Разводись схемка, больша и маленька..




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

Похожие статьи:
Деда Мороз 2 - новогодние стихи.
Глюки в News'e - О глюках, которые были в предыдущих номерах газеты.
Железо - Расширение памяти кoмпьютера ZS Sсorрion 256.
Устав SPbZXNet - Устав сети SPbZXNet v2.18.
Откровения - откровения GAS 13 о конрверсиях на спектруме.

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