[#1] [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..
Czy da się jakoś zoptymalizować ten kod? Służy on do szybkiego wyczyszczenia bitmapy, przy czym zeby wyczyścić 6 bitowa bitmapę trzeba tego kodu użyć 6 razy:

#linia = 40 * 256

Statement mycls{a.l}

  MOVE.l d0, a0
  ADD.l #linia, a0

  MOVEQ #0, d0
  MOVEQ #0, d1
  MOVEQ #0, d2
  MOVEQ #0, d3
  MOVEQ #0, d4
  MOVEQ #0, d5
  MOVEQ #0, d6

  MOVE.l d0, a1
  MOVE.l d0, a2
  MOVE.l d0, a3

  MOVE #255,d7

  loop:
    MOVEM.l d0-d6/a1-a3, -(a0)
    DBRA d7, loop

  AsmExit
End Statement

; samo czyszczenie trzeba powtorzyc 6 razy z przesunietym adresem:
mycls{Peek.l (Addr BitMap(0)+8)}
mycls{Peek.l (Addr BitMap(0)+12)}
mycls{Peek.l (Addr BitMap(0)+16)}
mycls{Peek.l (Addr BitMap(0)+20)}
mycls{Peek.l (Addr BitMap(0)+24)}
mycls{Peek.l (Addr BitMap(db)+28)}


Ostatnia aktualizacja: 09.02.2020 00:50:15 przez mateusz_s
[wyróżniony] [#2] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@mateusz_s, post #1

Tak, jak sie pozbedziesz dbra, czyli dasz 256 razy pod rzad
movem.l d0-d6/a1-a3,-(a0) ; czysci 40 bajty

moze byc jeszcze szybciej jak dasz

movem.l d0-d7/a1-a6,-(a0) ; czysci 52 bajty

ale to musisz sobie wyliczyc ile razy potrzebujesz uzyc danego czyszczenia, no i wyczyscic rejestry d7,a4,a5,a6 tez.
[wyróżniony] [#3] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@Don_Adan, post #2

dzięki za odpowiedź..

a tak z ciekawości to czemu pominięcie petli i wpisanie recznie 256 wartosci ma to przyśpieszyć?

myslalem ze mozna to jakos przyspieszyc w sensie zeby nie uzywac 6 razy tej komendy z tym przesunięciem, to chyba chodzi o pojededyncze czyszczenie kazdego bitplana

a4-a6 chyba nie mogę użyć bo wg instrukcji blitza:
Please note that when using assmbler inline and within procedures address
registers A4-A6 must be preserved. Blitz uses A5 as a global variable base. A4 as
a local variable base, and tries to keep A6 from having to be re-loaded too often.
[wyróżniony] [#4] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@mateusz_s, post #3

dodałem ten rejestr a7 jeszcze czyli razem to 44 bajty, wiec petla sie skróciła do 232 iteracji, wiec i tak lepiej niż było.. dokładnie nie moge powiedziec ile zyskalem bo w bliztu nie ma timera jako takiego wiec nie wiem jak to policzyc..

mozna coś jeszcze z tego wyciągnąć?
[wyróżniony] [#5] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@mateusz_s, post #3

no bo kazda instrukcja kosztuje troche cykli w zaleznosci od procesora a dbra to jest petla. czyli procesor nie wykonuje juz tej instrukcji 256 razy tylko samo wypelnianie/czyszczenie pamieci. mozesz uzyc a4-a6, tylko musialbys dodac na poczatku tego kodu
movem.l a4-a6,-(sp)
a na koncu
movem.l (sp)+,a4-a6
[wyróżniony] [#6] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@mateusz_s, post #4

a7? chyba d7, przy a7 to sie raczej wywali program.
na nie systemowych grach/programach mozna jeszcze tez uzywac a7 do czyszczenia, ale tak robia lub robili tylko koderzy dem.

no chyba, ze ty nie wyzerowales a7, ale wtedy to nie jest czyszczenie pamieci, kazdy rejestr sluzacy do czyszczenia pamieci w tej procedurze musi byc wczesniej wyzerowany.

Ostatnia aktualizacja: 09.02.2020 04:56:15 przez Don_Adan
[wyróżniony] [#7] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@Don_Adan, post #6

Tak d7, oczywiście :)
Dzięki, sprawdzę jeszcze to o czym napisałeś..
[wyróżniony] [#8] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@mateusz_s, post #7

tylko d7 to jest licznik petli w oryginale, wiec musisz go wyzerowac najpierw jak ma czyscic, a jak go wyzerujesz to petla wykona sie tylko jeden raz. d7 moze byc uzyte tylko w wersji bez instrukcji dbra
nie wiem czy w ogole znasz asembler 68k choc troche, ale bez jego minimalnej znajomosci to sobie nie poradzisz.
pierwsze 2 instrukcje to jest ustawienie adresu konca bufora do czyszczenia,
potem 10 instrukcji zerujacych rejestry,
nastepnie ustawienie licznika petli dla d7
i na koniec petla czyszczaca.
wiec jak cokolwiek sam zmieniasz to musisz to zmieniac w sposob odpowiedni. sama zmiana uzywanych rejestrow w movem.l nie wystarczy, potrzebne sa jeszcze inne zmiany, jesli robisz cos innego niz zwykle zastapienie dbra przez wpisanie tam dodatkowych 255 instrukcji movem.l d0-d6/a1-a3.
[wyróżniony] [#9] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@mateusz_s, post #3

No można... tylko 6 bitplanów należy ułożyć tak, aby stanowiły ciągły blok pamięci, a najlepiej to zrobić - chyba się to nazywało: interleaved bitmap, czyli w pamięci masz:
linia#1 bitplan#1
linia#1 bitplan#2
...
linia#1 bitplan#6
linia#2 bitplan#1
...
linia#2 bitplan#6
itd.

Co to daje? Na przykład - operując na pikselach jednej linii można użyć instrukcji z krótszymi przesunięciami, czyli szybszych.
[#10] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@Don_Adan, post #8

Hej, asemblera nie znam ale sobie poradziłem w obu przypadkach, dobrze mi to opisałeś więc przy okazji czegoś się nauczyłem, nie miałem pojęcia że można to tak przyśpieszyć..
dzięki jeszcze raz..

tylko nie mogłem w Blitzu skorzystać z "sr", ale w innym przykładzie zrobili to samo tylko ze zamiast sr wykorzystali a7 właśnie.. więc finalnie pętla z 256 skróciła się do 196..

jeszcze się zastanawiam, że skoro 6 razy wykonuję tą procedurę z przesuniętym adresem, to czy nie można wydłużyć tej pętli 6 razy i za jednym zamachem to wyczyścić..
[#11] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@BigBang, post #9

to chyba grubsza zabawa, zastanawiam sie jeszcze czy mozna wydluzyc taą petle zeby od razu wyczycisc cały blok a nie wywoływac tej funkcji 6 razy, no i dlaczego pierwsze wywolanie tej funkcji jest z dresem bitmpay przesunietym o 8 a kolejne o 4 ?

Ostatnia aktualizacja: 09.02.2020 14:35:02 przez mateusz_s
[wyróżniony] [#12] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@mateusz_s, post #10

SR to jest inny rejestr, chyba o SP ci chodzilo. SP i A7 to jest to samo dla asemblera. Jezeli to jest obszar ciagly pamieci to mozesz tak zrobic, ze czyscisz ja na raz. A nie w 6 czesciach.
[#13] Re: [ASM, BLITZ] Czy można zoptymalizowac ten asemblerowy kod..

@Don_Adan, post #12

Tak xD znowu literówka z mojej strony
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem