[#1] [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?
Hej,
Większość programów ma swoje funkcje pixel plot, umieszczające jeden pixel na bitmapie. Na pewno są mocno zoptymalizowane, ale z drugiej strony muszą działać we wszystkich warunkach..

Ale jeśli znam specyficzne warunki w których chcę używać tej funkcji, czy można napisać bardziej zoptymalizowaną wersję? Np. żeby jedno wywołanie wstawiało od razu dwa piksele?

moje warunki:
- bitmapa 3 bitplanowa (wszystkie bity ustawione na zero)
- bitmapa zajmuje ciągły obszar w pamięci
- rozmiar 320x256
- ewentualnie jako wariant może ona być interleaved
- indeks koloru stały, moze isc przez parametr albo byc sztywno zapisany w funkcji

- do wykorzystania jako parametry funkcji mamy rejestry d0-d5 i tu np.
d0 - mógłby być adresem bitmapy
d1,d2 - współrzędnymi x,y pierwszego piksela
d3, d4 - współrzędnymi drugiego piksela
d5 - ewentualnie wartosc indesu koloru

ja niestety za cienki w uszach jestem na asemblera.. ale może Ktoś z Was ma pomysł albo może odesłać do jakiś przykładów ,

Ostatnia aktualizacja: 08.03.2020 19:57:33 przez mateusz_s

Ostatnia aktualizacja: 08.03.2020 20:13:42 przez mateusz_s
[wyróżniony] [#2] Re: [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?

@mateusz_s, post #1

Obawiam sie ze jesli te piksele sa rozstrzelone daleko od siebie to stawianie ich bedzie polegalo na postawieniu jednego a pozniej drugiego, czyli nic nie zyskasz.
Lepiej by bylo gdyby piksele lezaly obok siebie lub chociarz w jednej linii.
Wtedy pozycje Y mozna by wyliczyc tylko raz.
[#3] Re: [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?

@Phibrizzo, post #2

Póki co, spory przyrost uzyskałem zamieniając zwykłą bitmapę na interleaved..
[wyróżniony] [#4] Re: [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?

@mateusz_s, post #1

Jeżeli kolor punktów jest stały możesz zastosować zabieg, polegający na zdefiniowaniu tylko jednego bitplanu, zawierającego wartości 1 tam, gdzie chcesz ustawić punkty. Następnie ten bitplan wklejasz we wszystkie 3 bitplany.

Żeby wklejanie było efektywne i wykorzystywało 32-bitowe zapisy wystarczy wówczas ustawić bity odpowiedzialne za punkty w jednym rejestrze danych Dn. Dopiero po odczytaniu wszystkich punktów w tym słowie, wkleić zawartość tego rejestru do pamięci graficznej.

Przykład: Jeżeli współrzędne punktów są posortowane (co polecam) według współrzędnych Y, a później X, możesz przebiegać tablicę ze współrzędnymi i zapalać w rejestrze Dn odpowiednie bity. Dopiero po wypełnieniu rejestru, wklejać jego kopię do 3 bitplanów.

Zminimalizujesz wówczas liczenie wielu punktów w słowie i zredukujesz liczbę zapisów do pamięci graficznej.

Poniżej przykład jakby można było to zapisać. Współrzędne X są posortowane i na końcu jest wartość -1 (ujemna) oznaczająca koniec tablicy punktów.

; A0: Współrzędne X punktów
; A1: Adres początku pamięci graficznej linii
; BPR: Wartość stała - liczba bajtów w wierszu (bitmapa typu interleaved)

CLR.W	D1		; Aktualny indeks słowa
CLR.L	D3		; Dane graficzne (1=zapalone punkty)

.następny:

MOVE.W	(A0)+,D0	; Odczyt współrzędnej X punktu
BMI.S	.opróżnij		; Jeżeli wartość ujemna - koniec tablicy
MOVE.B	D0,D2		; Kopia
ANDI.B	#$1F,D2		; Odczyt współrzędnej w słowie 0-31
NEG.B	D2
ADDI.B	#$1F,D2		; Odwrócenie liczby na numer bitu
LSR.W	#5,D0		; Odczyt indeksu słowa
CMPI.W	D0,D1		; Czy leży w tym samym słowie?
BEQ.S	.omiń		; Skocz gdy leży w tym samym słowie

; Opróżnienie bufora
.opróżnij:
LSL.W	#2,D1		; Liczymy indeks długiego słowo (dla CPU 68000)
MOVE.L	D3,(A1,D1.W)	; Zapisujemy do pamięci graficznej pod indeks D0
MOVE.L	D3,BPR(A1,D1.W)
MOVE.L	D3,BPR*2(A1,D1.W)
MOVE.W	D0,D1		; Aktualizujemy indeks
BMI.S .koniec

CLR.L	D3
.omiń:
BSET	D2,D3

BRA.S	.następny

.koniec: 
RTS


Ostatnia aktualizacja: 08.03.2020 23:11:46 przez Hexmage960
[#5] Re: [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?

@mateusz_s, post #1

Czy mógłbyś zawsze pisać tak dokładnie jak się da o jaką maszynę docelową Ci chodzi. Mam na myśli procesor (na przykład 68000), kości (na przykład OCS), ilość pamięci (na przykład tylko 512kb CHIP), czy OS friendly czy nie. Bez obrazy ale myślę że to sporo ułatwi.

Myślę że ten link może pomóc link.

A propos asemblera to tak nie uważam że jesteś za cienki. Po prostu trzeba przestać narzekać i przysiąść zadem. Jest masa rzeczy w necie na temat asm 68000 i sporo do ami.
[#6] Re: [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?

@asman, post #5

słusznie,
A1200, AGA, proc 020/030
[#7] Re: [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?

@Hexmage960, post #4

zawierającego wartości 1 tam, gdzie chcesz ustawić punkty. Następnie ten bitplan wklejasz we wszystkie 3 bitplany.


ale czy w ten sposób nie uzyskam tylko wartości skadajacych sie z samych jedynek? wtedy bede mial jedynki w tych miejscach we wszystkich bitplanach..
[#8] Re: [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?

@mateusz_s, post #7

Tak, przepraszam - wklejasz tylko w te bitplany wyrażone przez kolor piksela: Jeżeli ten kolor to np. 5 = %101 wklejasz tylko w bitplan 0 i 2.
[#9] Re: [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?

@Hexmage960, post #8

Tak, przepraszam - wklejasz tylko w te bitplany wyrażone przez kolor piksela: Jeżeli ten kolor to np. 5 = %101 wklejasz tylko w bitplan 0 i 2.


Wklejanie tylko bitplanu 0 i 2 zaklada ze wczesniej nic nie bylo na ekranie narysowane. Malowanie pikseli po biplanach ktore juz zawartosc maja wymaga zawsze zapisania.
[#10] Re: [ASM] Szybka funkcja PIXEL PLOT w konkretnych warunkach?

@mschulz, post #9

Kolega Mateusz napisał, że bitplany są wyzerowane. Ale oczywiście zgoda - wówczas w pozostałe bitplany trzeba wkleić bity wyzerowane.

Pojawia się pytanie, czy kolega chce ustawiać te punkty, czy je dodawać do istniejącej grafiki tła.

Załóżmy, że chcemy wklejać te piksele i mamy np. w A2 wskaźnik na dane graficzne tła w linii. Wówczas cała część odpowiedzialna za wklejanie (łączenie punktów z wybranym tłem i rysowanie całości) mogłaby wyglądać np. tak:

; D4: Indeks koloru piksela
; A2: Dane graficzne tła w tej linii
; GLEB: Liczba bitplanów

	CLR.B	D5		; Licznik bitplanów 0, 1, ..., GLEB-1

	BRA.S	.wklej
.nastBitplan:
	ADDI.L	#BPR,D1		; Zwiększamy przesunięcie by wskazywało na nast. bitplan
.wklej:
	MOVE.L 	D3,D6
	NOT.L	D6		; Odwrócone bity
	AND.L	(A2,D1.W),D6	; Pobieramy tło tam gdzie nie ma punktów
	BTST	D5,D4
	BEQ.S	.ominbitplan	; Czy ustawić czy zostawić nieruszone?
	OR.L	D3,D6		; Ustawiamy punkty w bitplanie
.ominbitplan:
	MOVE.L	D6,(A1,D1.W)
	ADDQ.B	#1,D5
	CMPI.B	#GLEB,D5
	BLT.S	.nastBitplan
; Gotowe


Ostatnia aktualizacja: 09.03.2020 09:53:13 przez Hexmage960
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