Последний раз редактировалось Sergey; 11.02.2015 в 22:33.
С уважением,
Gris / Red Triangle.
_____________________________________
ZX-EVO/TS-Labs config/NGS/HDD/SD-card
Amiga A1200/Blizzard 1230@50/32/60GB
Amiga A1200/Apollo 1260@66/32/60GB
UnAmiga (C5) AGA GM7123 VideoDAC
Ты молодец.
Если бы тему не поднял я бы не решился пихать в этюды (а уж тем более ломать башку над оптимумом)
(так бы и юзал то что вначале привёл в пример. правда до тех пор пока не пришла пора мою 3д оптимизить. пока что я пишу так, навскидку лишь-бы работало, скорость буду выжимать потом)
А на счёт короткости - забей, никому байт не помешает (ну не сможешь ты заюзать 1024 процедуры. да ещё чтоб в каждой байт сэкономить и килобайт получить. это не так делается)
Последний раз редактировалось Destr; 11.02.2015 в 22:37.
Искренне рад оказаться полезным
---------- Post added at 23:57 ---------- Previous post was at 23:46 ----------
Итог. Сравнение двух 16-битных чисел со знаком.
Вход: HL = число №1, DE = число №2.
Выход: CF=1 - число в HL меньше; CF=0 - число в DE меньше или равно HL.
Самая короткая процедура (7 байт, 33/37 тактов, средн.35 тактов), автор Destr:
Самая быстрая процедура (10 байт, 34/33 такта, средн.33,5 такта), авторы Destr, Sergey:Код:LD A,H ; 4 XOR D ; 4 JP P,CHD ; 10 EX DE,HL ; 4 CHD SBC HL,DE ; 15 <ветвление по результату сравнения (CF)>
Код:LD A,H ; 4 XOR D ; 4 JP P,CHD ; 10 ld a,e ; 4 sub l ; 4 ld a,d ; 4 sbc a,h ; 4 <ветвление по результату сравнения (CF)> CHD SBC HL,DE ; 15 <ветвление по результату сравнения (CF)>
Последний раз редактировалось Sergey; 11.02.2015 в 23:05.
С уважением,
Gris / Red Triangle.
_____________________________________
ZX-EVO/TS-Labs config/NGS/HDD/SD-card
Amiga A1200/Blizzard 1230@50/32/60GB
Amiga A1200/Apollo 1260@66/32/60GB
UnAmiga (C5) AGA GM7123 VideoDAC
Есть ещё ньюанс - зачастую ветвления нет.
Нужен только флаг С
Рабочий пример:
Где CP_HLDE - наш макрос сравнения.Код:LD HL,арг1:LD DE,арг2:CP_HLDE:RL C LD HL,арг3:LD DE,арг4:CP_HLDE:RL C LD A,C:AND 3:RET Z:CP 3:SCF:RET Z
В последней строчке - принимается решение по выходу в зависимости от результатов двух сравнений.
Вот и посчитай как это всё умедлится если юзать ветвления.
---------- Post added at 23:55 ---------- Previous post was at 23:40 ----------
(+20 тактов, ого!)
Последний раз редактировалось Destr; 11.02.2015 в 23:44.
Заглохла темка. Прочитал про dither 2x2, вышел вот такой набор:
Интересно, как использовать набор как чанки 4х4, и есть ли смысл заниматься?
Написал программу генерации лабиринта, алгоритм взят Здесь
Идея заглохла - как показать на экране, оставлю код здесь.
Код:device zxspectrum128 ORG #6400 begin bw: db 1,2,4,8 bx: db 0,0,1,-1 by: db -1,1,0,0 runi: PLOTTBL EQU #6000 ld sp,$FFE0 call FORMER ld de,$0101 call ma ld hl,$5800,de,$5801,bc,767,(hl),7:ldir jr $ ma: ; a(x,y)=1;a[p] := True; {make a path} call PLOT ld a,(bc):or (hl):ld (bc),a Repeat: ld ix,bw; d=0;{check For allowable directions} ;D=y,E=x ;up ; If y>2 And a(x,y-2)=0:d+1:EndIf ld a,d cp 2 jr c,test2 push de dec d,d call PLOT pop de jr nz,test2 ld a,ixl:or 1:ld ixl,a test2: ;;down ; If y<190 And a(x,y+2)=0:d+2:EndIf ld a,d cp 190 jr nc,test4 push de inc d inc d call PLOT pop de jr nz,test4 ld a,ixl:or 2:ld ixl,a test4: ;;right ; If x<>253 And a(x+2,y)=0:d+4:EndIf ld a,e cp 253+1 jr z,test8 push de inc e inc e call PLOT pop de jr nz,test8 ld a,ixl:or 4:ld ixl,a test8: ;;left ; If x>2 And a(x-2,y)=0:d+8:EndIf ld a,e cp 2 jr c,test_e push de dec e dec e call PLOT pop de jr nz,test_e ld a,ixl:or 8:ld ixl,a test_e: ld a,ixl:or a:ret z ; If d <> 0 ; Repeat; {choose a direction that's legal} ; i = Random(4); ; Until (d &(1<<i)); ld b,bw/256 cho_dir: call random and 3 ld c,a ld a,(bc) and ixl jr z,cho_dir ; a(x+bx(i),y+by(i) )=1;;;;a[p + b[i]] := True; {make a path} ; push ix ld ixl,c push de ld a,e:add a,(ix+4):ld e,a ld a,d:add a,(ix+8):ld d,a call PLOT ld a,(bc):or (hl):ld (bc),a ; ei:halt ; m(x+bx(i)*2,y+by(i)*2);;m(p + 2 * b[i]); {recurse} ;pop de ld a,e:add a,(ix+4):ld e,a ld a,d:add a,(ix+8):ld d,a call ma pop de ; pop ix jp Repeat ; EndIf ; Until d = 0; {Until stuck} random: R1:LD C,$15+3 R2:LD A,#70 ADD A,C:LD C,A LD (R1+1),A R3:LD A,#FD SUB C:LD C,A,(R2+1),A RRCA:LD (R3+1),A RET FORMER LD DE,#4000,BC,#8000,L,E FLP1 LD H,high PLOTTBL LD (HL),D:INC H:LD (HL),E:INC H LD (HL),C:INC H:LD (HL),B RRC B LD A,C:ADC A,0:LD C,A FBR1 INC D:LD A,D:AND 7 JR NZ,FNXT:LD A,E:ADD A,32 LD E,A:JR C,FNXT LD A,D:SUB 8:LD D,A FNXT INC L:JR NZ,FLP1 LD HL,PLOTTBL+#C0,BC,#3F LD DE,HL:INC E LD (HL),0:LDIR RET ;-----------ставим точку на DE------------------------ PLOT:; PUSH HL,BC LD H,HIGH PLOTTBL,L,D,B,(HL):INC H LD A,(HL),L,E:INC H:OR (HL) INC H:LD C,A,A,(BC) and (hl) ;OR (HL):LD (BC),A ; POP BC,HL RET end display /d,end-begin savesna "!void.sna",runi;begin
denpopov, тебе алгоритм нужен? или для общего развития выкладываешь?
С уважением,
Jerri / Red Triangle.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)