Wpis z mikrobloga

#programista15k #asembler #programowanie #gamedev Cześć, wytłumaczy Ktoś ten kawałek kodu w asemblerze krok po kroku, troche jak krowie na granicy, czesc rzeczy rozumiem, ale nie wiem np. o co chodzi kiedy jest napisane (a0) w nawiasie itp

gdzie:
d0 = adres bitmapy w pamieci
d1 = szerokosc bitmapy np. 320
d2 = wysokosc bitmapy np. 256

MOVE.l d0,a0:
MULU (a0),d2
MOVE.l d(a0),a0:
ADD.l d2,a0
MOVE d1,d2:
LSR#3,d2:
ADD d2,a0:
BSET.b d1,(a0)
  • 5
@ZawzietyRobaczek: (a0) w nawiasie to użycie pamięci pod adresem zawartym w a0, to samo co \*a0 w C.
d(a0) to mniej więcej \*(d+a0) (przy czym obliczenia są tu w zawsze bajtach), gdzie d to jakaś stała.
Masz poczytaj: https://archive.org/details/Pocket_Guide_Assembly_Language_for_the_68000_Series/mode/2up
Kod wygląda, że wczytuje 16-bitową szerokość spod adresu w d0 i 32-bitowy adres bitmapy z d+d0, po czym włącza pixel o współrzędnych X=d1 Y=d2. Bitmapa jest jednobitowa (pewnie jeden bitplane na Amidze
@vytah: tak dokładnie, choć liczyłem że wyjaśnisz krok po kroku każda instrukcję co i jak :D
.. wczesniej rozgryzałem kod ktory czyścił bufor i trochę mi szczena opadła jak się okazało ze można zmiejszyść ilosć iteracji pętli i koniec końców bardzo zoptymalizować ten proces i tak troceh się zacząlem interesować, ale na razie proboje zrozumieć konkretne przykłady i instrukcje..
@ZawzietyRobaczek: Zauważyłem właśnie, że szerokość w strukturze jest podana w bajtach, czyli szerokość w pikselach podzielona przez 8
MOVE.l d0,a0 – kopiuje do a0 wskaźnik na szerokość (nie można używać wskaźników bezpośrednio w d0-d7, bo 68000 tak już ma; .l oznacza operację 32-bitową)
MULU (a0),d2 – mnoży 16-bitową szerokość odczytaną przez wskaźnik razy Y, dając numer bajtu na początku wiersza
MOVE.l d(a0),a0 – odczytuje z d+a0 w a0 wskaźnik na początek