kategoria: Asembler
[#1] AGA startup, Copper list i kolory
Hej. Ja dzisiaj po prośbie do koderów...
W sieci jest sporo tutoriali i przykładów jak zacząć pisać w ASM pod Amigi z OCS/ECS. Są tutoriale Photona i masa innych przykładów, ale jakoś nie widziałem przykładów i tutoriali pod AGA w assemblerze. To czego szukam i co by mi ułatwiło pracę to m.in:
- startup kod który wyłączy WB i przełączy tryb w PAL i pozwoli zbudować własną copper listę ale uwzględni że mogę go uruchomić z RTG. Startup Photona tego nie uwzględnia
- przykład jak ustawiać kolory AGA (24 bit) w copper liście. niby wiadomo, ale może ktoś ma gotowce?
- inne procedurki/przykłady jak pisać pod AGA w ASM.
- ustawianie 8 bitplanów?
- HAM8?
Jak by ktoś miał w C to też może być :)
Z góry dzięki.
ps. przykład Bartmana/Abyss w GCC w narzędziach do VSCode też chyba nie przełącza z RTG prawidłowo do PALu?
[#2] Re: AGA startup, Copper list i kolory

@c64portal, post #1

- startup kod który wyłączy WB i przełączy tryb w PAL i pozwoli zbudować własną copper listę ale uwzględni że mogę go uruchomić z RTG. Startup Photona tego nie uwzględnia

Żeby zwolnić pamięć, z której korzysta WB można skorzystać z funkcji CloseWorkBench() z biblioteki intuition.
Uwaga: nie zawsze Workbench zostanie zamknięty jeżeli są uruchomione na nim jakieś programy. Funkcja zwraca wartość FALSE, gdy nie udało się zamknąć.

Jeżeli nie wiesz jak korzystać z bibliotek, to w Asemblerze otwierasz bibliotekę intuition za pomocą:

movea.l 4.w,a6
lea intuitionName(pc),a1
moveq #40,d0
jsr _LVOOpenLibrary(a6)
move.l d0,intuitionBase
beq.s .libError

intuitionBase: dc.l 0
intuitionName: dc.b 'intuition.library',0

Teraz załączasz "lvo/intuition_lib.i" (w razie czego ten plik należy wygenerować programem LVO z NDK) i wywołujesz:

movea.l intuitionBase(pc),a6
jsr _LVOCloseWorkBench(a6).
tst.l d0
beq.s .wbCloseError

Żeby wyłączyć system biblioteka lowlevel.library z Amiga OS 3.1 ma funkcję SystemControlA() do tego celu (tag SCON_TakeOverSys).

Żeby załadować własną copperlistę można wywołać LoadView(NULL) a następnie ustawić rejestr coplc1. Nie jestem pewien czy współpracuje to z powyższą funkcją SystemControlA().

Żeby przywrócić systemową copperlistę z powrotem, ładujesz ją z bazy biblioteki graphics.library - pole gb_copinit w GfxBase ładujesz do coplc1. Załącznik "graphics/gfxbase.i" z NDK.

System przywracasz za pomocą tej samej funkcji SystemControlA().

P.S. Generalnie pod AGA można korzystać z dobrodziejstw systemu, które nierzadko upraszczają i przyśpieszają programowanie i rozwiązywanie problemów. Szczególnie jak chcesz zachować kompatybilność z RTG. Polecam też płytę Amiga Developer CD - zawiera mnóstwo materiałów.

Ostatnia aktualizacja: 17.02.2023 22:07:39 przez Hexmage960
[#3] Re: AGA startup, Copper list i kolory

@Hexmage960, post #2

dzięki Hex
ja w tej chwili używam na początku Forbid(); Disable(); a potem Permin(); i Enable ();
z Copperlistami też sobie radzę (tak, LoadView(NULL))
w zasadzie to co nie jest dla mnie jasne to jak wyłączyć tryb RTG, przełączyć się na PAL i moją copperlistę a potem wrócić do RTG
Z kolorami (24 bit) to w sumie bym sobie jakoś poradził bo w sumie wiem jak to się robi ale może ktoś ma gotowca, np jakieś makro? procedurkę?
[#4] Re: AGA startup, Copper list i kolory

@c64portal, post #3

Z kolorami (24 bit) to w sumie bym sobie jakoś poradził bo w sumie wiem jak to się robi ale może ktoś ma gotowca, np jakieś makro? procedurkę?

Ja jako programista systemowy znam gotowe rozwiązania do tego celu. Te rozwiązania to skorzystać z copperlisty, którą tworzy system.

Funkcje SetRGB32(), LoadRGB32() i SetRGB32CM() utworzą dla Ciebie odpowiednią copperlistę.

Ponadto będzie to copperlista z kolorami ustawionymi poprawnie niezależnie od tego, czy uruchamiasz swoją produkcję na Amidze 500 OCS, Amidze 600 z ECS czy A1200 z AGA.

Copperlista utworzona przez system znajduje się w polu struktury View->LOFCprList. Jest tam surowa copper-lista oraz rozmiar bufora. Możesz skorzystać z niej jako bazy dla własnej copperlisty. To znaczy rozszerzyć ją po swojemu.

Copper-lista systemowa jest tworzona za pomocą funkcji MakeVPort() i MrgCop(). Pierwsza tworzy pośrednią listę poleceń Coppera, a druga łączy pośrednie listy w całość, gotową do załadowania do rejestru Coppera.

w zasadzie to co nie jest dla mnie jasne to jak wyłączyć tryb RTG, przełączyć się na PAL i moją copperlistę a potem wrócić do RTG

Tutaj nie wiem, ale chyba AGA i RTG pracują niezależnie. Workbench na karcie graficznej pewnie działa oddzielnie, zaś niektóre funkcje graficzne są zmienione. OpenWorkBench() powinien załadować ekran WB z powrotem. Nie mam tu niestety doświadczenia.

Ostatnia aktualizacja: 17.02.2023 23:10:27 przez Hexmage960
[#5] Re: AGA startup, Copper list i kolory

@Hexmage960, post #4

chyba AGA i RTG pracują niezależnie


no chyba tak... teraz efekt z zastosowaniem "mojego" kodu do startupu jest taki że zaczyna mi grać muzyka ale ekran pozostaje w trybie RTG tak jakby nie przełączył się na tryb AGA. Więc moje rozumienie jest takie że wyłączam system, ale nie wyłączam RTG...
Znalazłem w sieci że Photon/Scoopex na którego kodzie bazowałem twierdzi że jego kod powinien działać z RTG czyli przełączać się na AGA PAL. popatrzę jeszcze co robię źle.

Co do kolorów to raczej nie zamierzam korzystać z funkcji systemowych, ale dzięki.
[#6] Re: AGA startup, Copper list i kolory

@c64portal, post #5

A możesz wkleić kod Twojego startupu ?
[#7] Re: AGA startup, Copper list i kolory

@c64portal, post #5

Ja robię tak:
view = GfxBase->ActiView;
LoadView( NULL );
WaitTOF();
WaitTOF();

SetUpCop( &pic );

custom.dmacon = DMAF_SPRITE;
custom.intena = INTF_VERTB;
custom.cop1lc = (ULONG)cprlist1;
custom.copjmp1 = NULL;

MouseWait();

custom.cop1lc = (ULONG)GfxBase->copinit;
custom.copjmp1 = NULL;
custom.intena = INTF_SETCLR|INTF_VERTB;
custom.dmacon = DMAF_SETCLR|DMAF_SPRITE;

LoadView( view );
WaitTOF();
WaitTOF();
[#8] Re: AGA startup, Copper list i kolory

@c64portal, post #5

A ten startup probowales? Z tego co wiem to dziala i pod AGA i pod RTG.

link
[#9] Re: AGA startup, Copper list i kolory

@asman, post #6

A możesz wkleić kod Twojego startupu ?

W sumie mój startup jest identyczny jak ten który wkleił Cholok. (piszę w C)
ale w międzyczasie poszukałem i jest taki wątek na EAB
http://eab.abime.net/showthread.php?t=99010
i wg niego loadview() powinno załatwiać sprawę nawet na RTG. zrobię dzisiaj testy za chwilę bo może robię jakiś głupi błąd, skoro to powinno działać.

a przy okazji kolorów to znalazłem taki wątek na ADA https://ada.untergrund.net/?p=boardthread&id=37
i tu z kolei piszę że ustawianie kolorów w Copperze nie koniecznie zawsze jest dobrym pomysłem. W sumie po przeczytaniu jest to logiczne i aż się dziwię że wcześniej nie pomyślałem aby po prostu kolory ustawiać raz na początki a nie w Copperze jak nie muszę ich zmieniać w czasie ramki.

Wychodzi na to że jak się zada pytanie na PPA a potem troche pogugluje to znajduje się odpowiedzi ;)
Dzięki za pomoc ;)
[#10] Re: AGA startup, Copper list i kolory

@c64portal, post #9

Wywal jeśli robisz na początku Forbid a potem Disable, to może być przyczyna, wywal Disable.

Jeśli chodzi o Coppera to możesz także ustawiać inne rzeczy prockiem też. Ja często mam w copperliście tylko pointery do bitplanów i pointery do sprajtów.

planes:
		dc.w	bplpt,0,bplpt+2,0
		dc.w	bplpt+4,0,bplpt+6,0
		dc.w	bplpt+8,0,bplpt+10,0
		dc.w	bplpt+12,0,bplpt+14,0

		dc.w	$1007,$fffe

sprites:	dc.w	sprpt,0,sprpt+2,0
		dc.w	sprpt+4,0,sprpt+6,0
		dc.w	sprpt+8,0,sprpt+10,0
		dc.w	sprpt+12,0,sprpt+14,0
		dc.w	sprpt+16,0,sprpt+18,0
		dc.w	sprpt+20,0,sprpt+22,0
		dc.w	sprpt+24,0,sprpt+26,0
		dc.w	sprpt+28,0,sprpt+30,0
		dc.w	$ffff,$fffe


Jest tam taki wait $1007, który czeka na linię 16. Najważniejsze by przed 25 linią (dla PAL) załadować pointery do sprajtów. Może tego waita nie być. Ja go daję bo gdy wstawiam tam odpowiednie adresy, robię to gdzieś na początku głównej pętli

MainGameLoop:
 bsr WaitForFrame
 bsr UpdateSpritePointers
 ;poruszanie hero i enemies, kolizje, boby i inne bzdety.

O co chodzi z tym. Gdybym ustawiał te adresy później, bo na przykład postawiłem ileś bobów blitterem i to zajęło pół ramki, to byłoby opóźnienie związane ze sprajtami, bo zostały zmienione nie wtedy kiedy trzeba. Oczywiście można ograć to za pomocą dwóch coperrlist, dwóch ekranów i wtedy nie masz tego waita, wszystko co widzisz jest ramkę do tyłu ale user tego nie widzi. Oczywiście prowadzi to do innych problemów (rozwiązując jeden dowalamy kilka innych :) ). Trzeba wtedy raczej posiłkować się ofsetami zamiast adresami. Nie ma nic za nic :)

Ja myślę że warto zadawać pytania. Można się sporo nauczyć.
[#11] Re: AGA startup, Copper list i kolory

@asman, post #10

dzięki asman.
wiele rzeczy właśnie zacząłem robić poza copperlistą. oczywiście oprócz ustawiania BPLPT bo to musi być.
jakoś w końcu uporałem się też z ustawianiem kolorów. niby oczywiste jak czyta się opis jak działa paleta 256 kolorów w AGA, ale napisanie tego chwilę mi zajęło. wklejam bo może komuś się przyda.
UWORD nyb1 = 0x000;
UWORD nyb2 ;

	for (int j=1; j<9 ; j++){
		for (int i=0; i<32; i++){
			
			nyb2 = 0x000;
			custom->bplcon3 = nyb1 | nyb2;

			UBYTE r = c[k+1 ] >>4 ;			
			UBYTE g = c[k+2 ] >>4 ;
			UBYTE b = c[k+3 ] >>4 ;
			custom->color[i] = r<<8 | g<<4 | b;

			nyb2 = 0x200;
			custom->bplcon3 = nyb1 | nyb2;

			r = c[k+1 ] &0x0f ;
			g = c[k+2 ] &0x0f ;
			b = c[k+3 ] &0x0f ;
			custom->color[i] = r<<8 | g<<4 | b;

			k+=4;
		}
		nyb1 = 0x2000*j;
	}


niejest to jakieś super optymalne, ale w miarę czytelne. co ciekawe kod w asm jaki z tego wychodzi jest też całkiem ładny.
używam GCC (i vasm) z rozszerzenia Bartmana/Abyss. Fajny zestaw narzędzi dla VSCode. Polecam.

Ale mam kolejną zagwozdkę i tutaj totalnie nie wiem gdzie szukać rozwiązania: Mój kod kompiluję dla 060 (ale i dla 040 też próbowałem) i ładnie chodzi pod emulatorem. chodzi też na realnym sprzęcie z TF060, ale bez SetPatcha. Jak odpalę SetPAtch albo spod Workbencha program wywala od razu Guru. Opcje jakie mam w Makefilu dla kompilatora to:
CCFLAGS = -g -MP -MMD -m68060 -Ofast -nostdlib -Wextra -Wno-unused-function -Wno-volatile-register-var -fomit-frame-pointer -fno-tree-loop-distribution -flto -fwhole-program -fno-exceptions
VASMFLAGS = -m68060 -Felf -opt-fconst -nowarn=62 -dwarf=3 -quiet -x -I. -I$(SDKDIR)


w zasadzie usunąłem na chwilę cały kod w asm żeby sprawdzić czy nie bruździ, ale dalej jest guru.Program jest prosty bo tylko wyłącza system (tak jak kilka postów powyżej) i ustawia copperlistę. No i chodzi na real sprzęcie bez setpatcha.
Co to może być? Gdzie zacząć szukać przyczyny.
[#12] Re: AGA startup, Copper list i kolory

@c64portal, post #11

VBR
[#13] Re: AGA startup, Copper list i kolory

@Don_Adan, post #12

OK. to jest jakiś trop.
Ja w tej chwili robie to tak jak w templacie Bartman'a czyli
static APTR GetVBR(void) {
	APTR vbr = 0;
	UWORD getvbr[] = { 0x4e7a, 0x0801, 0x4e73 }; // MOVEC.L VBR,D0 RTE

	if (SysBase->AttnFlags & AFF_68010) 
		vbr = (APTR)Supervisor((ULONG (*)())getvbr);

	return vbr;
}

jak dla mnie to nieczytelne jest ale założyłem że jest poprawne.
jak inaczej "wziąć" vbr?
[#14] Re: AGA startup, Copper list i kolory

@c64portal, post #13

Obadaj jak jest w ACE link.
[#15] Re: AGA startup, Copper list i kolory

@asman, post #14

no to jest tak samo :)
[#16] Re: AGA startup, Copper list i kolory

@c64portal, post #13

Na C sie nie znam, ale chyba wyglada ok. Ale nie chodzi tutaj o sam odczyt VBR. Tylko o jego uzycie. Jak zapisujesz do rejestrow z VBR to zamiast np. $68, uzywasz $68(A0), gdzie A0 to jest VBR. W tym startupie Stingraya jest to pokazane.
[#17] Re: AGA startup, Copper list i kolory

@c64portal, post #15

Zrób test i wyłącz data cache i sprawdź czy działa Twój program. Jeśli działa to znaczy że jest inaczej niż w Ace, czyli kod dotyczący vbr jest umieszczony w danych a powinien być umieszczony w sekcji kodu. Możesz też zrobić pobranie vbr jako osobny plik asemblera, kompilowac go i linkować go z C.
[#18] Re: AGA startup, Copper list i kolory

@asman, post #17

no właśnie miałem pisać bo zrobiłem taką zmianę (wzorując się trochę na ACE)
__attribute__((section("text")))
__attribute__((aligned(4)))
static const UWORD getvbr[] = {0x4e7a, 0x0801, 0x4e73};

i zadziałało :)
dodałem na wszelki wypadek align 4 bo skoro to jest kod do którego procesor skacze to może powinno być wyrównane do 4. tak czy siak. działa!
ciekawe że nikt tego nie wyłapał wcześniej a wydawało by się że plugin do vscode Bartmana jest popularny. chyba zgłoszę bug'a.

idąc dalej z testami od razu sprawdziłem czy c2p kalms'a działa i ... działa :)
tak, że teraz idę dalej i robię kolejne próby bo przymierzam się do małej produkcji ;)
na pewno będę tu jeszcze pytał. na ten moment - wielkie dzięki Panowie!
[#19] Re: AGA startup, Copper list i kolory

@c64portal, post #18

Ten błąd jak dobrze pamiętam to wyłapał remz z EAB, pewnie Kain potwierdzi. Jest tam taki wątek o tech demo gry w ham.

Powodzenia.
[#20] Re: AGA startup, Copper list i kolory

@asman, post #19

Dokładnie tak jak asman pisze - Remz złapał błąd, zresztą nie tylko ten - sporo poprawił w moim odtwarzaniu modków. Attribute aligned(4) nie powinien być potrzebny - przecież 68k ma część instrukcji długości 16-bit, więc wystarczy wyrównanie do parzystego bajtu, które gcc dla symboli domyślnie zapewnia.
[#21] Re: AGA startup, Copper list i kolory

@teh_KaiN, post #20

no ale nie jest tak że ta tablica z opcodami trafia do sekcji gdzie są inne zmienne/tablice?

no i przy okazji może jeszcze dopytam co dają opcje -m68040 060 dla VASMa i dla GCC
tzn co konkretnie?
[#22] Re: AGA startup, Copper list i kolory

@c64portal, post #18

Ogolnie wszystko zalezy po co Ci ten VBR jest. Ja tam wolalem uzywac AddIntVec i SetIntVec, mniej problematyczne i dziala nawet z wylaczonym system, tylko bodaj zamiast RTE trzeba RTS uzywac. A samo pobieranie VBR w ten sposob tez nie za bardzo lubilem, takie maloczytelne. Wolalem cos takiego:

GetVBR
	moveq	#0,d0			; default at $0
	move.l	4.w,a6
	btst        #0,296+1(a6)		; 68010+?
	beq.b	is68k			; nope.
	jsr	     SuperState(a6)
        movec vbr,d0
       jsr          UserState(a6)
is68k
 ; VBR in D0


No chyba ze jest jakies przeciwskaznie, zeby tak to robic.
[#23] Re: AGA startup, Copper list i kolory

@Don_Adan, post #22

Albo tak, jak od razu uzywasz VBR:
GetVBR
	sub.l       A0,A0			; default at $0
	move.l	4.w,a6
	btst        #0,296+1(a6)		; 68010+?
	beq.b	is68k			; nope.
	jsr	     SuperState(a6)
        movec vbr,A0
       jsr          UserState(a6)
is68k
; VBR in A0
[#24] Re: AGA startup, Copper list i kolory

@teh_KaiN, post #20

Dla mnie dziwne jest dlaczego w XXI wieku, uzywa sie rozwiazan sprzed jakis 30 lat do odczytu VBR? Wspolczesne kompilatory nie potrafia skompilowac "movec VBR,D0"? Wersja hex byla uzywana w zrodlach tylko dlatego, ze owczesne asemblery Amigowe nie potrafily tej instrukcji zasemblowac, jak tez wielu innych instrukcji 68020 i 68881. Ta instrukcja to powinien byc zwykly kod a nie hex, wtedy to musialby byc zawsze na parzystym adresie.
[#25] Re: AGA startup, Copper list i kolory

@Don_Adan, post #24

Oczywiście że potrafią skompilować taki kod. W vbcc można zrobić coś takiego.
ULONG asmVBR(void)="\tmovec vbr,d0";

ULONG VbrGet(void)
{
	return asmVBR();
}


Oczywiście trzeba by ustawić przy kompilacji flagę -cpu=68010, by udało się skompilować. W przeciwnym razie gdy mamy -cpu=68000 wywali błąd z wiadomych błędów.

Spekuluje że zapis w postaci danych, nie powoduje problemów gdy kompilujemy pod 68000 a mamy zachowaną kompatybilność do góry. Ale jak widać to ułatwienie, spowodowało że się wywalało na prockach z data cache.

Nauka z tego dla mnie że najlepiej kompilować z flagą -cpu=68010.

@c64portal
Z tą flagą to niestety trzeba sprawdzić organoleptycznie. Bardzo możliwe że jest zaimplementowane przestawianie instrukcji, gdzieś kiedyś na ppa było o tym w kontekscie gcc (Cahir o tym pisał jak dobrze pamiętam). W przypadku 68060 to nie ma mulu na longach i pewnie dowala procedurę mnożenia.
[#26] Re: AGA startup, Copper list i kolory

@Don_Adan, post #24

Zapis hex działa z każdym kompilatorem. VBCC, GCC od Bebbo i GCC od Bartmana mają różnice w składni wstawek asemblerowych, a że to jest jedyna rzecz w ACE niebędąca w C to nie chciało mi się z jakąś ujednolicającą warstwą walczyć.

@c64portal

Jest tak jak mówisz, ale tylko jak zadeklarujesz tablicę jako static const. Jak zrobisz to bez tego w środku funkcji (jak miałem to w ACE i jak to ma Bartman w kodzie startowym) to wylądują na stosie i wtedy najwyraźniej wszystko wybucha. Tego że atrybut .text jest wymagany nie do końca rozumiem, bo w sumie czy poleci ta tablica na stertę do .text czy do .rodata to powinien być jeden ciul. Może nie jest w ogóle potrzebny? Nie mam żadnego konfiga 060, nawet wirtualnego, więc nie mam jak sprawdzić, możesz porobić testy.

Ostatnia aktualizacja: 21.02.2023 12:16:14 przez teh_KaiN
[#27] Re: AGA startup, Copper list i kolory

@teh_KaiN, post #26

Ale chyba wszystkie te 3 kompilatory uzywaja lub moga uzywac VASM? Wiec co to za roznica? Ciekawe czy "c64portal" uzywa tego VBR do czegos, bo nie trzeba jego uzywac.
[#28] Re: AGA startup, Copper list i kolory

@asman, post #25

Tak, to jest najlepsze rozwiazanie w tym przypadku, kompilowac na 68010, zeby program zadzialal tez na 68000. Ja osobiscie nigdy nie lubilem ustawiania procesorow w PhxAsm (czyli w VAsm tez). Jak program zawieral opcjonalny kod na jakis procesor to trzeba bylo zmieniac procesor w zrodle, a takie zmiany to lykalo tylko pare asemblerow, inne przerywaly asemblacje. Bo po asemblacji np. tylko na 68020, program wywalal sie na 68000 z powodu autooptymalizacji. A juz jak ktos pisal program z wlasna procedura rozpoznajaca CPU to trzeba bylo sporo takich zmian zrobic. Ogolnie na Phxasm wystarczyl by zwykly "warning", ze uzyto komendy 68010+, a nie przerywanie asemblacji.
[#29] Re: AGA startup, Copper list i kolory

@Don_Adan, post #27

Ciekawe czy "c64portal" uzywa tego VBR do czegos, bo nie trzeba jego uzywac.

używam np tak:
void SetInterruptHandler(APTR interrupt) {
	*(volatile APTR*)(((UBYTE*)VBR)+0x6c) = interrupt;
}

na razie wiele rzeczy po prostu mam skopiowane z templatea projektu jaki tworzy to rozszerzenie Bartmana. Powoli zmieniam i się uczę. Moją grę na C64 napisałem w sumie w C ale tam C to jednak dużo prostsze jest. Pewnie dla tego że arch komputera dużo prostsza. Ale zabawa w poznawanie C + AGA + 060 na razie bardzo fajna.
[#30] Re: AGA startup, Copper list i kolory

@c64portal, post #29

Jesli tylko do tego, to chyba AddIntVec mogloby byc lepsze. Nigdy sam tego nie testowalem, ale jak mi kiedys testerzy pisali ze to lepiej wtedy dziala na roznych niestandardowych Amigowych trybach, typu DoublePAL i inne takie.
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