Tebe się bawi w testy, pobawię się i ja.
Kopiowanie danych po pamięci hektarem kodu. 65C816/1,77 MHz.
Bufor źródłowy znajduje się pod (przypadkowo wybranym) adresem $35a7, docelowy pod $36a7, a bufor wyrównany do granicy 256 bajtów pod $3800. Wielkość buforów: 256 bajtów.
1. Zwykle 8-bitowe lda $xxxx / sta $yyyy, najszybsza metoda dostępna dla 6502. 8 cykli na bajt, niecałe 20 linii skaningowych.
2. To samo, ale każda para rozkazów kopiuje word. 5 cykli na bajt, 12,5 linii (5 cykli na bajt).
3. Jeden z buforów (tu źródłowy) został wyrównany do granicy 256 bajtów i wskazany jako strona zerowa: lda $xx / sta $yyyy. 11,5 linii (4,5 cyklu na bajt)
4. Bufor źródłowy jako strona zerowa, docelowy jako stos: pei ($xx). 9 linii (3,5 cyklu na bajt)
5. To samo co 4, tylko bufor źródłowy wyrównany do granicy 256 bajtow. Niecałe 8 linii (3 cykle na bajt).
6. Bufor źródłowy jako strona zerowa (bez wyrównania), bufor docelowy jest wskazany rejestrem Y: lda $xx / sta $yyyy,Y. Niecałe 14 linii (5,5 cyklu na bajt)
7. Bufor źródłowy jest wskazany rejestrem X, a docelowy rejestrem Y: lda $xx,X / sta $yyyy,Y. Tyle samo co powyżej.
8. Jak 7, tylko bez użycia adresowania strony zerowej: lda $xxxx,X / sta $yyyy,Y. 15 linii skaningowych (6 cykli na bajt).
9. Przesłanie blokowe mvn. 7 cykli na bajt, 17,5 linii skaningowej (słabo, ale i tak szybciej od nr 1, a kod zajmuje tylko kilka bajtów).
Metodę nr 9 można bez większych ograniczeń stosować na całej pamięci (16 MB).
Metody nr 1, 2, 8 można zastosować na całej pamięci (16 MB), ale tylko w obrębie konkretnego segmentu 64k.
Metody nr 3, 6, 7 wymagają, żeby jeden z buforów znalazł się w obrębie pierwszych 64k.
Metody nr 4 i 5 wymagają, żeby oba bufory były w obrębie pierwszych 64k. Poza tym lepiej mieć przy tym wyłączone przerwania, bo mogą być niespodzianki :)
--
Refleksja: przykład nr 4 i 5 dobrze obrazuje, jak dobrym pomysłem jest zaimplementowanie w procesorze rejestrów adresowych, które się "same" inkrementują lub dekrementują, i o ile wydajniej można wtedy wykorzystać dokładnie tę samą magistralę: w przykładzie nr 1 procesor połowę (dokładnie, 4 cykle z każdych ośmiu) czasu spędza na pobieraniu z pamięci niewiele różniących się od siebie adresów.
EDIT: poglądowo dorzuciłem zrzut ekranu z tego samego programu działającego na 21 MHz. Oba zrzuty oczywiście z Altirry, ale na Antonii rzecz wygląda dokładnie tak samo jak na pierwszym z załączonych obrazków.
EDIT2: literówki.