Так это ж уже использование результатов сравнения, а не само сравнение. Ты, совершенно, прав.
Ну что, - мы, таки, молодцы? :)
Теперь надо утвердить две процедуры: самую быструю и самую короткую.
Вид для печати
Ты молодец.
Если бы тему не поднял я бы не решился пихать в этюды (а уж тем более ломать башку над оптимумом)
(так бы и юзал то что вначале привёл в пример. правда до тех пор пока не пришла пора мою 3д оптимизить. пока что я пишу так, навскидку лишь-бы работало, скорость буду выжимать потом)
А на счёт короткости - забей, никому байт не помешает (ну не сможешь ты заюзать 1024 процедуры. да ещё чтоб в каждой байт сэкономить и килобайт получить. это не так делается)
Искренне рад оказаться полезным :)
---------- 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)>
Есть ещё ньюанс - зачастую ветвления нет.
Нужен только флаг С
Рабочий пример:
Где 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 тактов, ого!)
Заглохла темка. Прочитал про dither 2x2, вышел вот такой набор:
http://www.graphicsmill.com/docs/gm/...cConcepts1.png
Интересно, как использовать набор как чанки 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, тебе алгоритм нужен? или для общего развития выкладываешь?