kategoria: Asembler
[#1] [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky
Cześć,
Mam taki problem.
Mój chunky bufor jest większy niż rozmiar ekranu.
Więc kiedy używam tej funkcji c2p ona konwertuje całą szerokość mojego chunky bufora
więc finlany efekt jest poszatkowany.

Dlatego chciałbym zeby funkcja uwzględniała offset pomiedzy końcem poprzedniej lini chunky a początkiem nowej lini.
Innymi słowy ze źródłowego bufora chce "wyciąć" tylko fragment o rozmiarze 320x256 który ma byc skonwertowany do bitmpl.

I w funkcji Kalmsa jak widzimy jest zapisane, że można to podać w a6 w funkji init:
; d6.l	(chunkylen) [bytes] -- offset between one row and the next in chunkybuf


Ale to niedziała, zreszta widac po kodzie ze a6 nie jest tam nawet uwzględnione..

Wiec mam pytanko, czy dałoby rade jakoś zmodyfikowac tą funkcję
żeby dodać ten offset?

korzystam z: c2p1x1_8_c5_040.s

;
;
; Date: 2000-04-11			Mikael Kalms (Scout/C-Lous & more)
;					Email: mikael@kalms.org
;
; About:
;   1x1 8bpl cpu5 C2P for contigous bitplanes and no horizontal modulo
;
;   This routine is intended for use on all 68040 and 68060 based systems.
;   It is not designed to perform well on 68020-030.
;
;   This routine is released into the public domain. It may be freely used
;   for non-commercial as well as commercial purposes. A short notice via
;   email is always appreciated, though.
;
; Timings:
;   Estimated to run at copyspeed on 040-40 and 060
;
; Features:
;   Handles bitplanes of virtually any size (4GB)
;
; Restrictions:
;   Chunky-buffer must be an even multiple of 32 pixels wide
;   If incorrect/invalid parameters are specified, the routine will
;   most probably crash.
;
; c2p1x1_8_c5_040_init			sets chunkybuffer size/pos & bplsize
; c2p1x1_8_c5_040			performs the actual c2p conversion
;


	section	code,code


; d0.w	chunkyx [chunky-pixels]
; d1.w	chunkyy [chunky-pixels]
; d2.w	(scroffsx) [screen-pixels]
; d3.w	scroffsy [screen-pixels]
; d4.l	(rowlen) [bytes] -- offset between one row and the next in a bpl
; d5.l	bplsize [bytes] -- offset between one row in one bpl and the next bpl
; d6.l	(chunkylen) [bytes] -- offset between one row and the next in chunkybuf

	XDEF	_c2p1x1_8_c5_040_init
	XDEF	c2p1x1_8_c5_040_init
_c2p1x1_8_c5_040_init
c2p1x1_8_c5_040_init
	move.l	d3,-(sp)
	mulu.w	d0,d3
	lsr.l	#3,d3
	move.l	d3,c2p1x1_8_c5_040_scroffs
	mulu.w	d0,d1
	move.l	d1,c2p1x1_8_c5_040_pixels
	move.l	d5,d0
	lsl.l	#3,d0
	sub.l	d5,d0
	move.l	d0,c2p1x1_8_c5_040_delta0
	addq.l	#4,d0
	move.l	d0,c2p1x1_8_c5_040_delta4
	move.l	d5,d0
	lsl.l	#2,d0
	move.l	d0,c2p1x1_8_c5_040_delta1
	move.l	d0,c2p1x1_8_c5_040_delta3
	move.l	d0,c2p1x1_8_c5_040_delta5
	move.l	d0,c2p1x1_8_c5_040_delta7
	sub.l	d5,d0
	move.l	d0,c2p1x1_8_c5_040_delta2
	move.l	d0,c2p1x1_8_c5_040_delta6
	move.l	d0,c2p1x1_8_c5_040_delta8
	move.l	(sp)+,d3
	rts



; a0	c2pscreen
; a1	bitplanes

	XDEF	_c2p1x1_8_c5_040
	XDEF	c2p1x1_8_c5_040
_c2p1x1_8_c5_040
c2p1x1_8_c5_040
	movem.l	d2-d7/a2-a6,-(sp)

	add.l	c2p1x1_8_c5_040_delta0(pc),a1
	add.l	c2p1x1_8_c5_040_scroffs(pc),a1

	move.l	c2p1x1_8_c5_040_pixels(pc),d0
	beq	.none
	add.l	a0,d0
	move.l	d0,-(sp)

	tst.b	16(a0)
	move.l	(a0)+,d0
	move.l	(a0)+,d1
	move.l	(a0)+,d2
	move.l	(a0)+,d3
	tst.b	16(a0)
	move.l	(a0)+,d4
	move.l	(a0)+,d5
	move.l	(a0)+,a5
	move.l	(a0)+,a6

	swap	d4			; Swap 16x4, part 1
	swap	d5
	eor.w	d0,d4
	eor.w	d1,d5
	eor.w	d4,d0
	eor.w	d5,d1
	eor.w	d0,d4
	eor.w	d1,d5
	swap	d4
	swap	d5

	move.l	d4,d6			; Swap 2x4, part 1
	move.l	d5,d7
	lsr.l	#2,d6
	lsr.l	#2,d7
	eor.l	d0,d6
	eor.l	d1,d7
	and.l	#$33333333,d6
	and.l	#$33333333,d7
	eor.l	d6,d0
	eor.l	d7,d1
	lsl.l	#2,d6
	lsl.l	#2,d7
	eor.l	d6,d4
	eor.l	d7,d5

	exg	d4,a5
	exg	d5,a6

	swap	d4			; Swap 16x4, part 2
	swap	d5
	eor.w	d2,d4
	eor.w	d3,d5
	eor.w	d4,d2
	eor.w	d5,d3
	eor.w	d2,d4
	eor.w	d3,d5
	swap	d4
	swap	d5

	move.l	d4,d6			; Swap 2x4, part 1
	move.l	d5,d7
	lsr.l	#2,d6
	lsr.l	#2,d7
	eor.l	d2,d6
	eor.l	d3,d7
	and.l	#$33333333,d6
	and.l	#$33333333,d7
	eor.l	d6,d2
	eor.l	d7,d3
	lsl.l	#2,d6
	lsl.l	#2,d7
	eor.l	d6,d4
	eor.l	d7,d5

	move.l	d1,d6			; Swap 4x1, part 1
	move.l	d3,d7
	lsr.l	#4,d6
	lsr.l	#4,d7
	eor.l	d0,d6
	eor.l	d2,d7
	and.l	#$0f0f0f0f,d6
	and.l	#$0f0f0f0f,d7
	eor.l	d6,d0
	eor.l	d7,d2
	lsl.l	#4,d6
	lsl.l	#4,d7
	eor.l	d6,d1
	eor.l	d7,d3

	move.l	d2,d6			; Swap 8x2, part 1
	move.l	d3,d7
	lsr.l	#8,d6
	lsr.l	#8,d7
	eor.l	d0,d6
	eor.l	d1,d7
	and.l	#$00ff00ff,d6
	and.l	#$00ff00ff,d7
	eor.l	d6,d0
	eor.l	d7,d1
	lsl.l	#8,d6
	lsl.l	#8,d7
	eor.l	d6,d2
	eor.l	d7,d3

	bra	.start

	cnop	0,4
.x
	tst.b	32(a0)
	move.l	(a0)+,d0
	move.l	(a0)+,d1
	move.l	(a0)+,d2
	move.l	(a0)+,d3
	tst.b	32(a0)
	move.l	(a0)+,d4
	move.l	(a0)+,d5
	move.l	(a0)+,a5
	move.l	(a0)+,a6

	move.l	d6,(a1)

	swap	d4			; Swap 16x4, part 1
	swap	d5
	eor.w	d0,d4
	eor.w	d1,d5
	eor.w	d4,d0
	eor.w	d5,d1
	eor.w	d0,d4
	sub.l	c2p1x1_8_c5_040_delta1(pc),a1
	eor.w	d1,d5
	swap	d4
	swap	d5

	move.l	d4,d6			; Swap 2x4, part 1
	move.l	d7,(a1)
	move.l	d5,d7
	lsr.l	#2,d6
	lsr.l	#2,d7
	eor.l	d0,d6
	eor.l	d1,d7
	and.l	#$33333333,d6
	and.l	#$33333333,d7
	eor.l	d6,d0
	eor.l	d7,d1
	lsl.l	#2,d6
	lsl.l	#2,d7
	eor.l	d6,d4
	eor.l	d7,d5

	exg	d4,a5
	add.l	c2p1x1_8_c5_040_delta2(pc),a1
	exg	d5,a6

	swap	d4			; Swap 16x4, part 2
	swap	d5
	eor.w	d2,d4
	eor.w	d3,d5
	eor.w	d4,d2
	eor.w	d5,d3
	eor.w	d2,d4
	eor.w	d3,d5
	swap	d4
	swap	d5

	move.l	a3,(a1)
	move.l	d4,d6			; Swap 2x4, part 2
	move.l	d5,d7
	lsr.l	#2,d6
	lsr.l	#2,d7
	eor.l	d2,d6
	eor.l	d3,d7
	and.l	#$33333333,d6
	and.l	#$33333333,d7
	eor.l	d6,d2
	eor.l	d7,d3
	lsl.l	#2,d6
	lsl.l	#2,d7
	eor.l	d6,d4
	eor.l	d7,d5

	move.l	d1,d6			; Swap 4x1, part 1
	move.l	d3,d7
	lsr.l	#4,d6
	lsr.l	#4,d7
	eor.l	d0,d6
	eor.l	d2,d7
	and.l	#$0f0f0f0f,d6
	and.l	#$0f0f0f0f,d7
	sub.l	c2p1x1_8_c5_040_delta3(pc),a1
	eor.l	d6,d0
	eor.l	d7,d2
	lsl.l	#4,d6
	lsl.l	#4,d7
	eor.l	d6,d1
	move.l	a4,(a1)
	eor.l	d7,d3

	move.l	d2,d6			; Swap 8x2, part 1
	move.l	d3,d7
	lsr.l	#8,d6
	lsr.l	#8,d7
	eor.l	d0,d6
	eor.l	d1,d7
	and.l	#$00ff00ff,d6
	and.l	#$00ff00ff,d7
	eor.l	d6,d0
	eor.l	d7,d1
	lsl.l	#8,d6
	lsl.l	#8,d7
	eor.l	d6,d2
	add.l	c2p1x1_8_c5_040_delta4(pc),a1
	eor.l	d7,d3
.start

	move.l	d2,d6			; Swap 1x2, part 1
	move.l	d3,d7
	lsr.l	#1,d6
	lsr.l	#1,d7
	eor.l	d0,d6
	eor.l	d1,d7
	and.l	#$55555555,d6
	and.l	#$55555555,d7
	eor.l	d6,d0
	eor.l	d7,d1
	move.l	d0,(a1)
	add.l	d6,d6
	add.l	d7,d7
	eor.l	d6,d2
	eor.l	d7,d3

	move.l	a5,d6
	move.l	a6,d7
	move.l	d2,a3
	move.l	d3,a4

	move.l	d5,d2			; Swap 4x1, part 2
	move.l	d7,d3
	lsr.l	#4,d2
	lsr.l	#4,d3
	sub.l	c2p1x1_8_c5_040_delta5(pc),a1
	eor.l	d4,d2
	eor.l	d6,d3
	and.l	#$0f0f0f0f,d2
	and.l	#$0f0f0f0f,d3
	eor.l	d2,d4
	move.l	d1,(a1)
	eor.l	d3,d6

	lsl.l	#4,d2
	lsl.l	#4,d3
	eor.l	d2,d5
	eor.l	d3,d7

	move.l	d4,d2			; Swap 8x2, part 2
	move.l	d5,d3
	lsr.l	#8,d2
	lsr.l	#8,d3
	add.l	c2p1x1_8_c5_040_delta6(pc),a1
	eor.l	d6,d2
	eor.l	d7,d3
	and.l	#$00ff00ff,d2
	and.l	#$00ff00ff,d3
	eor.l	d2,d6
	move.l	a3,(a1)
	eor.l	d3,d7

	lsl.l	#8,d2
	lsl.l	#8,d3
	eor.l	d2,d4
	eor.l	d3,d5

	move.l	d4,d2			; Swap 1x2, part 2
	move.l	d5,d3
	sub.l	c2p1x1_8_c5_040_delta7(pc),a1
	lsr.l	#1,d2
	lsr.l	#1,d3
	eor.l	d6,d2
	eor.l	d7,d3
	and.l	#$55555555,d2
	move.l	a4,(a1)
	and.l	#$55555555,d3

	eor.l	d2,d6
	eor.l	d3,d7
	add.l	d2,d2
	add.l	d3,d3
	eor.l	d2,d4
	eor.l	d3,d5

	add.l	c2p1x1_8_c5_040_delta8(pc),a1
	move.l	d4,a3
	move.l	d5,a4

	cmp.l	(sp),a0
	bne	.x

	move.l	d6,(a1)
	sub.l	c2p1x1_8_c5_040_delta1(pc),a1
	move.l	d7,(a1)
	add.l	c2p1x1_8_c5_040_delta2(pc),a1
	move.l	a3,(a1)
	sub.l	c2p1x1_8_c5_040_delta3(pc),a1
	move.l	a4,(a1)

	addq.l	#4,sp

.none	movem.l	(sp)+,d2-d7/a2-a6
	rts

			cnop	0,4

c2p1x1_8_c5_040_data
c2p1x1_8_c5_040_scroffs	ds.l	1
c2p1x1_8_c5_040_pixels	ds.l	1
c2p1x1_8_c5_040_delta0	ds.l	1
c2p1x1_8_c5_040_delta1	ds.l	1
c2p1x1_8_c5_040_delta2	ds.l	1
c2p1x1_8_c5_040_delta3	ds.l	1
c2p1x1_8_c5_040_delta4	ds.l	1
c2p1x1_8_c5_040_delta5	ds.l	1
c2p1x1_8_c5_040_delta6	ds.l	1
c2p1x1_8_c5_040_delta7	ds.l	1
c2p1x1_8_c5_040_delta8	ds.l	1


Ostatnia aktualizacja: 18.08.2025 14:39:40 przez mateusz_s

Ostatnia aktualizacja: 18.08.2025 14:40:03 przez mateusz_s
1
[#2] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@mateusz_s, post #1

Z tego co widzę również parametr d4.l jest nieobsługiwany, a oznacza on odległość między wierszami w bitmapie planarnej.

Wygląda na to, że ta funkcja albo konwertuje ciągły blok pamięci albo tylko jedną linię.

Kluczowe miejsca w głównej pętli programu to:

; Odłożenie na stos adresu za ostatnim konwertowanym pikselem:

	move.l	c2p1x1_8_c5_040_pixels(pc),d0
	beq	.none
	add.l	a0,d0
	move.l	d0,-(sp)

; Sprawdzenie czy doszliśmy do końca bufora chunky:

        cmp.l   (sp),a0
        bne     .x

Jeżeli chcesz sprawić by konwersja przebiegała po linijkach bitmapy, polecam jeden z dwóch sposobów:

1. Jeżeli w pierwszym cytowanym bloku odłożysz na stos długość jednego wiersza w pikselach, wtedy program przekonwertuje tylko jedną linię. Teraz możesz wykonywać ten program dla każdej linijki i samodzielnie dodawać długość wiersza bufora chunky do adresu wejściowego bufora.

2. Dodać odpowiednie zmienne do tego bloku ds.l pod programem, zapisać do nich zawartość rejestrów d4.l oraz d6.l w funkcji inicjującej, a następnie dodawać te wartości w odpowiednim miejscu pętli głównej, czyli w drugim cytowanym bloku. Pamiętaj, że tutaj warto obliczyć modulo (czyli różnicę pomiędzy końcem jednego wiersza i początkiem następnego), a nie szerokośc bufora.

Przykład:

c2p1x1_8_c5_040_chunkylen ds.l 1
c2p1x1_8_c5_040_rowlen    ds.l 1

; Sprawdzenie czy doszliśmy do końca bufora chunky:

        cmp.l   (sp),a0
        bne     .x

; Końcowy zapis

	move.l	d6,(a1)
	sub.l	c2p1x1_8_c5_040_delta1(pc),a1
	move.l	d7,(a1)
	add.l	c2p1x1_8_c5_040_delta2(pc),a1
	move.l	a3,(a1)
	sub.l	c2p1x1_8_c5_040_delta3(pc),a1
	move.l	a4,(a1)

; Przejście do kolejnej linijki

        adda.l  c2p1x1_8_c5_040_chunkylen(pc),a0 ; Aktualizacja adresu bufora chunky
        adda.l  c2p1x1_8_c5_040_rowlen(pc),a1    ; Aktualizacja adresu bufora planar

Trzeba ten przykład oczywiście uzupełnić, by wszystko grało.

Sposób nr 1 jest prostszy i ja bym go użył.

Sposób nr 2 będzie pewnie szybszy, bo funkcja Kalmsa korzysta z Cache procesora, więc lepiej umieścić tą aktualizację adresów buforów wejściowych tuż po dojściu do końca linii i wywołać kolejną iterację pętli.

Ostatnia aktualizacja: 18.08.2025 18:50:08 przez Hexmage960
1
[#3] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@mateusz_s, post #1

W inicie sa wykorzystywane D0.W, D3.W i D5.
A wyliczone z nich wartosci (na dole) sa wykorzystywane w c2p1x1_8_c5_040.
Wiec zamiast D6, musisz te 3 wartosci podac do initu.
[#4] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@Don_Adan, post #3

Sorry, pomylilem sie.
Jeszcze D1.W jest potrzebne.
Czyli 4 wartosci dla initu sa potrzebne.
[#5] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@Don_Adan, post #4

tzn. ja podaje te wartości i mi wszytko działa, ale ja chce teraz ze źródłowego bufora chunky tak jakby wyciać fragment o pewnej wielkosci a nie cały konwertować do bitplane.. wiec w tym celu powinienem podac w _a6 modulo lini bufora chunky - niestety ten parametr nie jest uwzgledniowy w reszcie algorytmu - wiec to nei dziala. Trzeba zrobić tak jak @HexMage pisze, tzn pomodyfikowac calosc troche
[#6] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@Hexmage960, post #2

Dzięki,
bede probowal, ale nie wiem czy sobie poradze :)
teraz robie w ten spsób - ze sam, wycinam ten fragment, tzn. kopiuje ten fragment 320x256 z duzego bufora do osobnego bufora o wielkosci juz 320x256, ale chcielbym ten krok pominac bo to niepotrzebne dodatkowe kopiowanie.
[#7] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@mateusz_s, post #6

Ja bym najpierw skorzystał z prostszego sposobu, tzn. zrobił analogicznie do tego jak działają funkcje WritePixelLine8() i WritePixelArray8().

To znaczy funkcja WritePixelLine8() konwertuje jedną linijkę, a funkcja WritePixelArray8() wywołuje tę pierwszą funkcję, a następnie dodaje szerokość bufora chunky do adresu bufora wejściowego.

Ten kod Kalmsa jest dość pogmatwany ze względu na optymalizacje na cache.

Możesz też spróbować skorzystać z innych implementacji.

Tutaj jest biblioteka współdzielona, która służy wyłącznie do konwersji chunky-to-planar. Ostatnio zaktualizowana rok temu, więc całkiem aktualna:

https://aminet.net/package/dev/misc/c2plib

Na pewno to wygodny sposób na dołączenie funkcji chunky-to-planar. Z tego co piszą w dokumentacji, korzysta z Cache i ma wersje dedykowane dla różnych procesorów (wykrywa procesor). Zawiera kod źródłowy, Autodoki dla języka C, Asm, Amiga E i przykłady.

Nie jestem jednak pewien, czy można określać szerokość bufora wejściowego, jak w funkcji WriteChunkyPixels(), ale raczej na pewno można.

Możesz też spróbować innych przykładów od Kalmsa.

Ostatnia aktualizacja: 19.08.2025 14:18:29 przez Hexmage960
[#8] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@Hexmage960, post #7

Te systemowe są ze 2x wolniejsze :/ wolę KaLmsa
[#9] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@mateusz_s, post #8

Te systemowe są ze 2x wolniejsze :/ wolę KaLmsa

Nie chodziło mi o systemowe.

Chodziło mi o sposób wykonywania (podział na linijki).

Również jeśli chodzi o tą zalinkowaną bibliotekę. Ona opiera się na efektywnych algorytmach, podobnych do tych od Kalmsa, nie ma nic wspólnego z oryginalnym systemowym WriteChunkyPixels().
[#10] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@mateusz_s, post #5

Stary jestem, ale chyba Ciebie zrozumialem w koncu.
Sprobuj tego:

Modulo = $2800
Length = $A00		; number of longwords per BitPlan to write

; static/dependent BitPlanes version for one chip ram area

; input
; A0 - source (chunky)
; A1 - destination (planar)
BEST_c2p
	add.w	BeginSkip(PC),A0

	move.l	#Modulo,A2		; Modulo
	lea	(A1,A2.L*4),A1		; A1+Modulo*4

	lea	-4(A1,A2.L*2),A3	; A1+Modulo*6-4
	add.l	#Length*4,A3		; loop test value


	sub.l	A6,A6
	lea	(A6,A2.L*8),A6		; Modulo*8
	sub.l	A2,A6			; Modulo*7

	move.l	#$00FF00FF,D7		; static
	move.l	#$33333333,D6		; static
	move.l	#$55555555,D5		; static
	move.l	#$0F0F0F0F,D4		; temp

	MOVE.L	(A0)+,D0
	MOVE.L	(A0)+,D1
	MOVE.L	(A0)+,D2
	MOVE.L	(A0)+,D3
	AND.L	D4,D0
	AND.L	D4,D1
	LSL.L	#4,D0
	OR.L	D1,D0
	AND.L	D4,D2
	AND.L	D4,D3
	LSL.L	#4,D2
	OR.L	D3,D2

	move.l	D4,D1
	move.l	D4,D3
	and.l	(A0)+,D1
	and.l	(A0)+,D3
	lsl.l	#4,D1
	or.l	D3,D1
	move.l	D4,D3
	and.l	(A0)+,D3
	and.l	(A0)+,D4

	LSL.L	#4,D3
	OR.L	D4,D3
	SWAP	D3
	MOVE.W	D2,D4
	MOVE.W	D3,D2
	MOVE.W	D4,D3
	SWAP	D3

	move.l	D1,D4
	move.w	D0,D4
	swap	D4
	move.w	D4,D0
	move.w	D1,D4
	move.l	D4,D1

	LSR.L	#2,D4
	EOR.L	D0,D4
	AND.L	D6,D4
	EOR.L	D4,D0

	bra.b	GoBC2P

LoopBC2P
	move.l	(A0)+,D0
	move.l	(A0)+,A4
	move.l	(A0)+,D2
	move.l	(A0)+,A5
	move.l	D4,(A1)			; chipram write
	exg	D1,A4
	exg	D3,A5

	MOVE.L	#$0F0F0F0F,D4
	AND.L	D4,D0
	AND.L	D4,D2
	LSL.L	#4,D0
	LSL.L	#4,D2
	AND.L	D4,D1
	AND.L	D4,D3
	OR.L	D1,D0
	OR.L	D3,D2

	sub.l	A2,A1			; A1+Modulo*5
	move.l	D4,D1
	move.l	D4,D3
	and.l	(A0)+,D1
	and.l	(A0)+,D3
	lsl.l	#4,D1
	or.l	D3,D1
	move.l	D4,D3
	and.l	(A0)+,D3
	and.l	(A0)+,D4

	move.l	A4,(A1)			; chipram write

	LSL.L	#4,D3
	OR.L	D4,D3
	SWAP	D3
	MOVE.W	D2,D4
	MOVE.W	D3,D2
	MOVE.W	D4,D3
	SWAP	D3

	move.l	D1,D4
	move.w	D0,D4
	swap	D4
	move.w	D4,D0
	move.w	D1,D4
	move.l	D4,D1

	sub.l	A2,A1			; A1+Modulo*4

	LSR.L	#2,D4
	EOR.L	D0,D4
	AND.L	D6,D4
	EOR.L	D4,D0

	move.l	A5,(A1)+		; chipram write

GoBC2P
	LSL.L	#2,D4
	EOR.L	D4,D1
	MOVE.L	D3,D4
	LSR.L	#2,D4
	EOR.L	D2,D4
	AND.L	D6,D4
	EOR.L	D4,D2
	LSL.L	#2,D4
	EOR.L	D4,D3
	MOVE.L	D2,D4
	LSR.L	#8,D4
	EOR.L	D0,D4
	and.l	D7,D4
	EOR.L	D4,D0
	LSL.L	#8,D4
	EOR.L	D4,D2
	MOVE.L	D2,D4
	LSR.L	#1,D4
	EOR.L	D0,D4
	and.l	D5,D4
	EOR.L	D4,D0

	sub.l	A2,A1			; A1+Modulo*3
	move.l	D0,(A1)			; chipram write

	ADD.L	D4,D4
	EOR.L	D2,D4
	MOVE.L	D3,D2
	LSR.L	#8,D2
	EOR.L	D1,D2
	and.l	D7,D2
	EOR.L	D2,D1
	LSL.L	#8,D2
	EOR.L	D2,D3
	MOVE.L	D3,D2
	LSR.L	#1,D2
	EOR.L	D1,D2
	and.l	D5,D2
	EOR.L	D2,D1
	ADD.L	D2,D2
	EOR.L	D2,D3

	sub.l	A2,A1			; A1+Modulo*2
	lea	-$20(A0),A0
	move.l	(A0)+,D0
	move.l	(A0)+,A4
	move.l	(A0)+,D2
	move.l	(A0)+,A5
	move.l	D4,(A1)			; chipram write

	exg	D1,A4
	exg	D3,A5

	MOVE.L	#$F0F0F0F0,D4
	AND.L	D4,D0
	AND.L	D4,D1
	LSR.L	#4,D1
	OR.L	D1,D0
	AND.L	D4,D2
	AND.L	D4,D3
	LSR.L	#4,D3
	OR.L	D3,D2

	sub.l	A2,A1			; A1+Modulo*1
	move.l	D4,D1
	move.l	D4,D3
	and.l	(A0)+,D1
	and.l	(A0)+,D3
	lsr.l	#4,D3
	or.l	D3,D1
	move.l	D4,D3
	and.l	(A0)+,D3
	and.l	(A0)+,D4
	move.l	A4,(A1)			; chipram write

	LSR.L	#4,D4
	OR.L	D4,D3
	SWAP	D3
	MOVE.W	D2,D4
	MOVE.W	D3,D2
	MOVE.W	D4,D3
	SWAP	D3

	move.l	D1,D4
	move.w	D0,D4
	swap	D4
	move.w	D4,D0
	move.w	D1,D4
	move.l	D4,D1

	LSR.L	#2,D4
	EOR.L	D0,D4
	AND.L	D6,D4
	EOR.L	D4,D0
	LSL.L	#2,D4
	sub.l	A2,A1			; A1+Modulo*0
	EOR.L	D4,D1
	MOVE.L	D3,D4
	LSR.L	#2,D4

	move.l	A5,(A1)			; chipram write

	EOR.L	D2,D4
	AND.L	D6,D4
	EOR.L	D4,D2
	LSL.L	#2,D4
	EOR.L	D4,D3
	MOVE.L	D2,D4
	LSR.L	#8,D4
	EOR.L	D0,D4
	and.l	D7,D4
	EOR.L	D4,D0
	LSL.L	#8,D4
	EOR.L	D4,D2
	MOVE.L	D2,D4
	LSR.L	#1,D4
	EOR.L	D0,D4
	and.l	D5,D4
	add.l	A6,A1			; A1+Modulo*7
	EOR.L	D4,D0

	ADD.L	D4,D4
	EOR.L	D2,D4

	move.l	D0,(A1)			; chipram write

	MOVE.L	D3,D2
	LSR.L	#8,D2
	EOR.L	D1,D2
	and.l	D7,D2
	EOR.L	D2,D1
	LSL.L	#8,D2
	EOR.L	D2,D3
	MOVE.L	D3,D2
	LSR.L	#1,D2
	EOR.L	D1,D2
	and.l	D5,D2
	EOR.L	D2,D1
	ADD.L	D2,D2
	EOR.L	D2,D3

	add.w	FullSkip(PC),A0
	sub.l	A2,A1			; A1+Modulo*6
	cmp.l	A3,A1
	bne.w	LoopBC2P

	move.l	D4,(A1)			; chipram write
	sub.l	A2,A1			; A1+Modulo*5
	move.l	D1,(A1)			; chipram write
	sub.l	A2,A1			; A1+Modulo*4
	move.l	D3,(A1)			; chipram write

	RTS
FullSkip
	dc.w	0	; how many bytes must be skipped from full c2p line
BeginSkip
	dc.w	0	; how many bytes must be skipped from begining of line



To bylo kiedys szybsze niz c2p od Kalmsa.

link

Ale nie wiem jakie c2p Kalmsa jest obecnie na GitHubie.
Mogl je potem zmodyfikowac, od czasu tych starych testow.
Ogolnie dodalem to pomijanie do tego mojego starego zmodyfikowanego c2p.
Powinno dzialac.
[#11] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@Don_Adan, post #10

A tutaj masz jeszcze szybsza wersje, moja ostatnia:

Modulo = $2800
Length = $A00		; number of longwords per BitPlan to write

; static/dependent BitPlanes version for one chip ram area

; input
; A0 - source (chunky)
; A1 - destination (planar)
BEST_c2p
	add.w	BeginSkip(PC),A0

	move.l	#Modulo,A2		; Modulo
	lea	(A1,A2.L*4),A1		; A1+Modulo*4

	move.w	#Length-1,D7

	sub.l	A6,A6
	lea	(A6,A2.L*8),A6		; Modulo*8
	sub.l	A2,A6			; Modulo*7
	sub.l	A2,A6			; Modulo*6

	move.l	#$0F0F0F0F,D4		; temp

	MOVE.L	(A0),D0
	MOVE.L	4(A0),D1
	MOVE.L	8(A0),D2
	MOVE.L	12(A0),D3
	AND.L	D4,D0
	AND.L	D4,D1
	LSL.L	#4,D0
	OR.L	D1,D0
	AND.L	D4,D2
	AND.L	D4,D3
	LSL.L	#4,D2
	OR.L	D3,D2

	move.l	D4,D1
	move.l	D4,D3
	and.l	16(A0),D1
	and.l	20(A0),D3
	lsl.l	#4,D1
	or.l	D3,D1
	move.l	D4,D3
	and.l	24(A0),D3
	and.l	28(A0),D4

	LSL.L	#4,D3
	OR.L	D4,D3

	move.l	D1,D6
	move.w	D0,D1
	swap	D1
	move.w	D1,D0
	move.w	D6,D1

	MOVE.L	D0,D4
	LSL.L	#2,D4
	EOR.L	D1,D4
	AND.L	#$CCCCCCCC,D4
	EOR.L	D4,D1
	LSR.L	#2,D4
	EOR.L	D4,D0

	sub.l	A2,A1			; A1+Modulo*3
	move.l	D3,D4
	move.w	D2,D3
	swap	D3
	move.w	D3,D2
	move.w	D4,D3

	MOVE.L	D2,D4
	LSL.L	#2,D4
	EOR.L	D3,D4
	AND.L	#$CCCCCCCC,D4
	EOR.L	D4,D3
	LSR.L	#2,D4
	EOR.L	D4,D2
	MOVE.L	D0,D4
	LSL.L	#8,D4
	EOR.L	D2,D4
	AND.L	#$FF00FF00,D4
	EOR.L	D4,D2
	LSR.L	#8,D4
	EOR.L	D4,D0
	MOVE.L	D0,D4
	ADD.L	D4,D4
	EOR.L	D2,D4
	AND.L	#$AAAAAAAA,D4
	EOR.L	D4,D2
	LSR.L	#1,D4
	EOR.L	D4,D0

	move.l	D0,(A1)			; 0.40 (average place) chipram write -> bit plane 4
	sub.l	A2,A1			; A1+Modulo*2

	MOVE.L	D1,D6
	LSL.L	#8,D6
	EOR.L	D3,D6
	AND.L	#$FF00FF00,D6
	EOR.L	D6,D3
	LSR.L	#8,D6
	EOR.L	D6,D1
	MOVE.L	D1,D6
	ADD.L	D6,D6
	EOR.L	D3,D6
	AND.L	#$AAAAAAAA,D6
	EOR.L	D6,D3
	lsr.l	#1,D6
	eor.l	D1,D6

	move.l	D2,(A1)			; 0.64 (average place) chipram write -> bit plane 3
	move.l	(A0)+,D0
	move.l	(A0)+,D4
	move.l	(A0)+,D2
	move.l	(A0)+,A5
	move.l	#$F0F0F0F0,D1
	and.l	D1,D0
	sub.l	A2,A1			; A1+Modulo*1
	and.l	D1,D4
	exg	D3,A5
	and.l	D1,D2
	lsr.l	#4,D4
	and.l	D1,D3
	or.l	D4,D0
	lsr.l	#4,D3
	move.l	D1,D4
	or.l	D3,D2
	move.l	D4,D3
	move.l	D4,D5
	and.l	(A0)+,D1
	and.l	(A0)+,D3
	and.l	(A0)+,D5
	move.l	D6,(A1)			; 0.01 (perfect place) chipram write -> bit plane 2
	and.l	(A0)+,D4
	sub.l	A2,A1			; A1+Modulo*0 (place OK)
	lsr.l	#4,D3
	or.l	D3,D1
	lsr.l	#4,D4
	or.l	D4,D5

	move.l	A5,(A1)			; 0.01 (perfect place) chipram write -> bit plane 1
	add.l	A6,A1			; A1+Modulo*6 (-4)

	move.l	D1,D6
	move.w	D0,D1
	swap	D1
	move.w	D1,D0
	move.w	D6,D1

	MOVE.L	D0,D4
	LSL.L	#2,D4
	EOR.L	D1,D4
	AND.L	#$CCCCCCCC,D4
	EOR.L	D4,D1
	LSR.L	#2,D4

	subq.l	#4,A6			; correction for bitplane 7 handling
	bra.w	GoBC2P

LoopBC2P
	move.l	(A0),D0
	move.l	4(A0),D1
	move.l	8(A0),D2
	move.l	12(A0),D3
	sub.l	A2,A1			; A1+Modulo*5

	AND.L	D4,D0
	AND.L	D4,D2
	LSL.L	#4,D0
	LSL.L	#4,D2
	AND.L	D4,D1
	AND.L	D4,D3
	OR.L	D1,D0
	OR.L	D3,D2

	move.l	D4,D1
	and.l	16(A0),D1
	move.l	D4,D3
	and.l	20(A0),D3
	lsl.l	#4,D1
	and.l	24(A0),D4
	or.l	D3,D1
	move.l	#$0F0F0F0F,D3
	move.l	D6,(A1)			; 0.04 (perfect place) chipram write -> bit plane 6
	sub.l	A2,A1			; A1+Modulo*4 (right place)
	and.l	28(A0),D3
	move.l	D5,(A1)+		; 0.22 (perfect place) chipram write -> bit plane 5
	sub.l	A2,A1			; A1+Modulo*3
	lsl.l	#4,D4
	or.l	D4,D3
	move.l	D1,D4
	move.w	D0,D1
	swap	D1
	move.w	D1,D0
	move.w	D4,D1

	MOVE.L	D0,D4
	LSL.L	#2,D4
	EOR.L	D1,D4
	AND.L	#$CCCCCCCC,D4
	EOR.L	D4,D1
	LSR.L	#2,D4
	EOR.L	D4,D0

	move.l	D3,D4
	move.w	D2,D3
	swap	D3
	move.w	D3,D2
	move.w	D4,D3

	MOVE.L	D2,D4
	LSL.L	#2,D4
	EOR.L	D3,D4
	AND.L	#$CCCCCCCC,D4
	EOR.L	D4,D3
	LSR.L	#2,D4
	EOR.L	D4,D2
	MOVE.L	D0,D4
	LSL.L	#8,D4
	EOR.L	D2,D4
	AND.L	#$FF00FF00,D4
	EOR.L	D4,D2
	LSR.L	#8,D4
	EOR.L	D4,D0
	MOVE.L	D0,D4
	ADD.L	D4,D4
	EOR.L	D2,D4
	AND.L	#$AAAAAAAA,D4
	EOR.L	D4,D2
	LSR.L	#1,D4
	EOR.L	D4,D0

	move.l	D0,(A1)			; 0.40 (average place) chipram write -> bit plane 4
	sub.l	A2,A1			; A1+Modulo*2

	MOVE.L	D1,D6
	LSL.L	#8,D6
	EOR.L	D3,D6
	AND.L	#$FF00FF00,D6
	EOR.L	D6,D3
	LSR.L	#8,D6
	EOR.L	D6,D1
	MOVE.L	D1,D6
	ADD.L	D6,D6
	EOR.L	D3,D6
	AND.L	#$AAAAAAAA,D6
	EOR.L	D6,D3
	lsr.l	#1,D6
	eor.l	D1,D6
	move.l	D2,(A1)			; 0.64 (average place) chipram write -> bit plane 3
	move.l	(A0)+,D0
	move.l	(A0)+,D4
	move.l	(A0)+,D2
	move.l	(A0)+,A5
	move.l	#$F0F0F0F0,D1
	and.l	D1,D0
	sub.l	A2,A1			; A1+Modulo*1
	and.l	D1,D4
	exg	D3,A5
	and.l	D1,D2
	lsr.l	#4,D4
	and.l	D1,D3
	or.l	D4,D0
	lsr.l	#4,D3
	move.l	D1,D4
	or.l	D3,D2
	move.l	D4,D3
	move.l	D4,D5
	and.l	(A0)+,D1
	and.l	(A0)+,D3
	and.l	(A0)+,D5
	move.l	D6,(A1)			; 0.01 (perfect place) chipram write -> bit plane 2
	and.l	(A0)+,D4
	sub.l	A2,A1			; A1+Modulo*0 (place OK)
	lsr.l	#4,D3
	or.l	D3,D1

	move.l	A5,(A1)			; 0.01 (perfect place) chipram write -> bit plane 1
	add.l	A6,A1			; A1+Modulo*6 (-4)

	lsr.l	#4,D4
	or.l	D4,D5
	move.l	D1,D6
	move.w	D0,D1
	swap	D1
	move.w	D1,D0
	move.w	D6,D1

	MOVE.L	D0,D4
	LSL.L	#2,D4
	EOR.L	D1,D4
	AND.L	#$CCCCCCCC,D4
	EOR.L	D4,D1
	LSR.L	#2,D4
	move.l	A3,(A1)+		; 0.64 (average place) chipram write -> bit plane 7
GoBC2P
	add.l	A2,A1			; A1+Modulo*7

	EOR.L	D4,D0
	move.l	D5,D6
	move.w	D2,D5
	swap	D5
	move.w	D5,D2
	move.w	D6,D5
	MOVE.L	D2,D4
	LSL.L	#2,D4
	EOR.L	D5,D4
	AND.L	#$CCCCCCCC,D4
	EOR.L	D4,D5
	LSR.L	#2,D4
	EOR.L	D4,D2
	MOVE.L	D0,D4
	LSL.L	#8,D4
	EOR.L	D2,D4
	AND.L	#$FF00FF00,D4
	EOR.L	D4,D2
	LSR.L	#8,D4
	EOR.L	D4,D0
	MOVE.L	D0,D4
	ADD.L	D4,D4
	EOR.L	D2,D4
	AND.L	#$AAAAAAAA,D4
	EOR.L	D4,D2
	LSR.L	#1,D4
	EOR.L	D4,D0
	move.l	D0,(A1)			; 0.66 (average place) chipram write -> bit plane 8
	sub.l	A2,A1			; A1+Modulo*6
	move.l	D2,A3
	MOVE.L	D1,D6
	LSL.L	#8,D6
	EOR.L	D5,D6
	AND.L	#$FF00FF00,D6
	EOR.L	D6,D5
	LSR.L	#8,D6
	EOR.L	D6,D1
	MOVE.L	D1,D6
	ADD.L	D6,D6
	EOR.L	D5,D6
	AND.L	#$AAAAAAAA,D6
	EOR.L	D6,D5
	LSR.L	#1,D6
	EOR.L	D1,D6
	MOVE.L	#$0F0F0F0F,D4
	add.w	FullSkip(PC),A0
	dbf	D7,LoopBC2P

	move.l	A3,(A1)			; chipram write -> bit plane 7
	sub.l	A2,A1			; A1+Modulo*5 
	move.l	D6,(A1)			; chipram write -> bit plane 6
	sub.l	A2,A1			; A1+Modulo*4
	move.l	D5,(A1)			; chipram write -> bit plane 5
	RTS

FullSkip
	dc.w	0	; how many bytes must be skipped from full c2p line
BeginSkip
	dc.w	0	; how many bytes must be skipped from begining of line
1
[#12] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@Don_Adan, post #11

O.. dziękuję, przetestuję.. ale tu się nie podaje żadnych rozmiarów np. 320x256, ?
[#13] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@mateusz_s, post #12

To w oryginale byla procedura uzywana do testow PCx by Jim Drew.
Czyli 320x200.
Pewnie, ze mozna zmienic rozmiar wyswietlanego obrazu modyfikujac wartosci Modulo i Length.
Te wielkosci moga byc pobierane jako dane, czyli tak samo jak FullSkip i BeginSkip.
Teraz sa na sztywno ustawione dla 320x200.
Ograniczenie jest takie, ze dlugosc linii chunky konwertowana do formatu planar to musi byc wielokrotnosc 32 bajtow.
Bo ta procedura odczytuje i zapisuje po 32 bajty w jednej petli.
Wiec jak chcesz jakies inne rozdzielczosci uzywac to musisz o tym pamietac.
1
[#14] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@mateusz_s, post #12

Ogolnie jak chcesz probowac to najpierw pierwsza wersje.
Nie wiem jaka rozdzielczosc przewidujesz, ale powiedzmy, ze max dla AGA chcesz przeznaczyc 800.000 bajtow, i tyle alokujesz pod systemem (bez buforowania).
Wtedy dzielisz to przez 8, i otrzymujesz 100000 jako Modulo.
Czyli ten obszar 800.000 bajtow to bedzie dla 8 bitplanow zaczynajacych sie
pod adresem A1 dla pierwszego bitplanu,
pod adresem A1+100000 dla drugiego bitplanu
pod adresem A1+200000 dla trzeciego bitplanu
....
pod adresem A1+700000 dla osmego bitplanu

A co do dlugosci linii, to wychodzi, ze dla Length=$A00 to jest 320x8, czyli tutaj podajesz np 640x8, albo 320x8, albo jakas inna wartosc, bedaca wielokrotnoscia 32×8.
1
[#15] Re: [ASM] Pytanie o modyfikacje c2p Kalmsa zeby konwertowała tylko fragment bufora chunky

@Don_Adan, post #14

Sorki, odpalilem ten tester Jim Drew na emulatorze.
I to jest animacja c2p, a nie zwykle c2p.
Zupelnie o tym zapomnialem.
Wiec musi byc przerobione, zeby mozna je bylo uzywac do tego czego chcesz.
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