oki, mialem teraz troche wiecej czasu i teraz napisalem troche inna implementacje tego rozkazu (wczesniej jedynie zoptymalizowalem twoj kod bez zmiany koncepcji)
jesli jest tak jak mysle, tzn ten rozkaz powoduje skopiowanie BC bajtow z HL do DE. to cos takiego powinno dzialac znacznie szybciej:
ldx z80_b
bne l2
; B=0 wiec kopiujemy C bajtow
ldx z80_c
beq end
ldy #0
l1 lda (z80_hl),y
sta (z80_de),y
iny
dex
bne l1
clc
tya
adc z80_l
sta z80_l
bcc *+5
inc z80_h
clc
tya
adc z80_e
sta z80_e
bcc *+4
inc z80_d
stx z80_c ; B juz jest zero!
end rts ; koniec
; B>0 wiec kopiujemy conajmniej B*256bajtow
l2 ldy #0
l3 lda (z80_hl),y
sta (z80_de),y
iny
bne l3
inc z80_hl+1
inc z80_de+1
dex
bne l3
; ok mamy juz skopiowane B*256bajtow, zostalo nam do
; skopiowania jeszcze C bajtow
ldx z80_c
beq end2
l4 lda (z80_hl),y
sta (z80_de),y
iny
dex
bne l4
clc
tya
adc z80_l
sta z80_l
bcc *+5
inc z80_h
clc
tya
adc z80_e
sta z80_e
bcc *+4
inc z80_d
stx z80_c
end2 stx z80_b
rts ; koniec
wzrost szybkosc polega na tym ,ze w tej wersji, fragment kodu:
tya
adc z80_l
sta z80_l
bcc _ed_b01
inc z80_h
clc
_ed_b01 tya
adc z80_e
sta z80_e
bcc _ed_b02
inc z80_d
clc
jest wykonywany tylko raz a u ciebie o ile sie nie myle bedzie wykonywany B+1 razy...
to samo tyczy sie tego fragmentu:
_ed_b02 lda z80_b
beq _ed_b04 ; koniec
dec z80_b
dex
jmp _ed_b05 ; kopiuj
ktory w mojej wersji juz nie jest potrzebny (dokladnie wiemy ile skopiowac bajtow juz na samym poczatku, wiec po co sprawdzac to, co kazdy obieg petli)
no i dla B<>0 petla kopiujaca jest o 2cykle szybsza (nie potrzebujemy tam instrukcji DEX bo wiemy, ze kopiujemy wielokrotnosc 256bajtow)
EDIT: na upartego, mozna by to przyspieszyc dla B<>0 np. tak:
petle:
l2 ldy #0
l3 lda (z80_hl),y
sta (z80_de),y
iny
bne l3
mozna troszke rozpisac:
l2 ldy #0
l3 lda (z80_hl),y
sta (z80_de),y
iny
lda (z80_hl),y
sta (z80_de),y
iny
lda (z80_hl),y
sta (z80_de),y
iny
lda (z80_hl),y
sta (z80_de),y
iny
lda (z80_hl),y
sta (z80_de),y
iny
lda (z80_hl),y
sta (z80_de),y
iny
lda (z80_hl),y
sta (z80_de),y
iny
lda (z80_hl),y
sta (z80_de),y
iny
bne l3
petla nierozpisana wykonuje sie: (5+6+2+3)*256=4096cykle
petla rozpisana(8razy) wykonuje sie: (3 + (5+6+2)*8)*32=3424cykle
nalezy pamietac, ze petla musi byc rozpisana N razy, gdzie N to potega dwojki, wiedz np. jak rozpiszesz to 10razy to nie bedzie dzialac poniewaz warunek "bne" bedzie sprawdzany nie w tym miejscu co powinnien