kategorie: ANSI C, Asembler
[#1] [ASM, c2p] Funkcje Chunky to Planar dla HAM6, HAM7 od Contraz
cześć,
Mam problem z funkcjami C2P do HAM6 i HAM7 od Contraza:
opis: https://amycoders.org/sources/fasttruec2p.html
kody: https://amycoders.org/sources/files/truecolorc2psource.txt

próbowałem podłaczyć jedną z funkcji Contraza HAM7, pod swój Raycaster, ale na razie efekt mizerny.
Udało mi się wyświetlić poszatkowany obraz ale reagujący na myszke, to znaczy że jakas konwersja zachodzi.

Ale nie do końca wszsytko rozumiem, i pewnie coś pochrzaniłem - dla porównania funkcje Kalmsa były lepiej opisane.

Może macie jakieś pomysły.. ?


-- 01 --
Pracuje w C, więc zacznę od tego czy dobrze zmodyfikowałem tą funkcję ASM ?
Korzystam z tej drugiej funkcji z pliku czyli SP_HAM7SCR:

W C dałem taki nagłowek:
extern void SP_HAM7SCR(void* c2pscreen __asm("a0"), void* bitplanes __asm("a1"));

W kodzie ASM pozmieniałem sam początek, w ten sposób:
section text, code
	xdef SP_HAM7SCR
	xdef _SP_HAM7SCR

SP_HAM7SCR
_SP_HAM7SCR
	movem.l	d2-d7/a2-a6,-(sp)

	move.l	#%00001111000011110000111100001111,d6
	move.l	#%00000000111111110000000011111111,d7
	move.l	#%00010001000100010001000100010001,a5

	; lea	chunkybuffer,a0             ;pointer to 15bit scrambled word chunkybuffer
	; move.l	logscreen,a1	    ;pointer to interleaved 8bpl ham8 screen


czyli zapisałem stos i wykresliłem te dwie funkcje bo w A0 powienin już być wskażnik na chunky a w A1 wskaznik na screen, a a na samym końcu funkcji przywróciłem stos:
movem.l	(sp)+,d2-d7/a2-a6
rts
Dodatkowo zmienne:
Scrx i Scry
zamieniłem w kodzie na odpowiednio
1280 i 256



-- 02 --
Co do screena, to otwieram PAL 1280x256x8 z flagą HAM_KEY, i na ten moment nie ustawiam Interleaved. Wg opisu powinno być Interleaved
ale wtedy mam tylko statyczne ekran z bohomazami.

// Get real, full info from display mode id.    
    struct DimensionInfo dn_Dimensioninfo;
    GetDisplayInfoData(NULL, (UBYTE*)&dn_Dimensioninfo, sizeof(struct DimensionInfo),  DTAG_DIMS,  FRM_requested_mode_id);

    FRM_requested_width = dn_Dimensioninfo.Nominal.MaxX + 1;
    FRM_requested_height = dn_Dimensioninfo.Nominal.MaxY + 1;
    FRM_requested_bits_per_pixel = dn_Dimensioninfo.MaxDepth;

    // Add HAM flag to requested display mode id.
    FRM_requested_mode_id |= HAM_KEY;

 FRM_screen = OpenScreenTags(	NULL,
                                            SA_DisplayID, FRM_requested_mode_id,	
                                            SA_Depth, FRM_requested_bits_per_pixel, 							
                                            SA_Type, CUSTOMSCREEN,
                                            SA_Quiet, TRUE,
                                            SA_Behind, TRUE,
                                            SA_ShowTitle, FALSE,
                                            SA_Draggable, FALSE,
                                            SA_Exclusive, TRUE,
                                            SA_AutoScroll, FALSE,
                                           // SA_Interleaved, TRUE,
                                            TAG_END);




-- 03 --
W pętli głownej mam tak:

SP_HAM7SCR(IO_prefs.output_buffer_32, FRM_Chip_Buffer[buffer_counter]);      

            // Link ready buffer to screen bitmap.
            FRM_screen->BitMap.Planes[0] = (PLANEPTR)FRM_Chip_Buffer[buffer_counter] + FRM_HAM8_bitplane_size * 0;
            FRM_screen->BitMap.Planes[1] = (PLANEPTR)FRM_Chip_Buffer[buffer_counter] + FRM_HAM8_bitplane_size * 1;
            FRM_screen->BitMap.Planes[2] = (PLANEPTR)FRM_Chip_Buffer[buffer_counter] + FRM_HAM8_bitplane_size * 2;
            FRM_screen->BitMap.Planes[3] = (PLANEPTR)FRM_Chip_Buffer[buffer_counter] + FRM_HAM8_bitplane_size * 3;
            FRM_screen->BitMap.Planes[4] = (PLANEPTR)FRM_Chip_Buffer[buffer_counter] + FRM_HAM8_bitplane_size * 4;
            FRM_screen->BitMap.Planes[5] = (PLANEPTR)FRM_Chip_Buffer[buffer_counter] + FRM_HAM8_bitplane_size * 5;

             // ---- nie jestem pewien tych dwóchostatnich - u Kalmsa nie mogło ich być ---

            FRM_screen->BitMap.Planes[6] = (PLANEPTR)FRM_Chip_Buffer[buffer_counter] + FRM_HAM8_bitplane_size * 6;
            FRM_screen->BitMap.Planes[7] = (PLANEPTR)FRM_Chip_Buffer[buffer_counter] + FRM_HAM8_bitplane_size * 7;

            RethinkDisplay();

gdzie:
UBYTE*  FRM_Chip_Buffer[] = { NULL, NULL };


I tutaj najbardziej nie jestem pewien czy czegoś nie pochrzaniłem.
Wg opisu pierwszy parametr powinien byc: pointer to 15bit scrambled word chunkybuffer
a drugi parametr to: pointer to interleaved 8bpl ham8 screen

Mój raycaster zapisuje do bufora typu UINT 32 w formacje A8 R8 G8 B8 - tak działało z funkcją Kalmsa.
W tym przypaku nie wiem do końca - czy mam sam zredukować kolory do R5 G5 B5 ?
Co to jest scrambled ? cos tam jest opisane na stronie ale nie do końca rozumiem jak mam ta kolejność pozmieniać.

No i drugi parametr, jak dam wskażnik na Screen to sie zawiesza. W taki sposób jak pokazalem tylko działa cokolwiek.



-- 04 --

Taki jest obecny efekt, obraz poszatkowany i w zupełnie innych kolorach, ale reagujący na "grę" czyli coś się tam konwertuje..



Jak dam tryb interleaved - to jest już sraka totalna:



Tu jeszcze przykład gdzie zamiast bufora UINT podpiąłem WORD wypełniony jednolitym kolorem, mimo tego sa jakieś przerwy pomiędzy liniami.
UWORD *buf15 = malloc(320*256*sizeof(WORD));
for (int y = 0; y < 256; y++)
{
    for (int x = 0; x < 320; x++)
    {
        UWORD rgb555 = (5 << 5) | (15 << 5) | 5;
        buf15[x+y*320] = rgb555;
    }
}


1
[#2] Re: [ASM, c2p] Funkcje Chunky to Planar dla HAM6, HAM7 od Contraz

@mateusz_s, post #1

Na szybko. Ogólnie masz sporo opisane na stronie:
- Różnica jest w zawartości bitplanów. Ta wersja ma maskę wrzuconą do pierwszych 2, nie 2 ostatnich. Pewnie tu jest największy problem.
- Masz opisane co znaczy scrambled. Tak jak myślałeś, musisz samemu nieco przygotować dane. Jeżeli masz zwykły texturemapper to po prostu robisz preprocess tekstur.
- Wg źródła zakłada 8bitplanów interleaved.
2
[#3] Re: [ASM, c2p] Funkcje Chunky to Planar dla HAM6, HAM7 od Contraz

@mateusz_s, post #1

Ja tam sie na C nie znam, ale bym zaczal od wyswietlania jakiegos statycznego screena, ktory znam i wiem jak wyglada.
I kombinowal, z kolejnoscia bitplanow oraz rozdzielczoscia, zeby metoda prob i bledow dojsc gdzie jest problem.
2
[#4] Re: [ASM, c2p] Funkcje Chunky to Planar dla HAM6, HAM7 od Contraz

@mateusz_s, post #1

SP w swojej procedurze c2p zaproponował format zapisu koloru pixela

WORD r0g0b0b0 r3g3b3b3 r1g1b1b1 r2g2b2b2

co oznacza

r0 - bit 0 koloru RED ustawiany w trynie ham6 (zapisywany na bplanie 1)
r3 - bit 3 koloru RED ustawiany w trybie ham6 (zapisywany ma bplanie 4)
itd.

na bitplanach 5,6 jst stała maska dla trybu Ham6 ustawiona w taki sposób aby modyfikować w trybie HAM6 składowe RGB

Bez konwersji tekstur na jego format będą wychodziły Ci krzaki

Ostatnia aktualizacja: 01.01.2025 00:55:30 przez Tedy
3
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