Przytrzymaj i zmodyfikuj — Hold-And-Modify

Image
Oryginalny obraz w pełnym kolorze
Image
Amiga HAM 4096 kolorowy obraz
Image
Fragment obrazu w pełnym kolorze (po lewej) vs Amiga HAM (po prawej)

Amiga HAM , zazwyczaj skracane jako HAM , jest tryb wyświetlania z Commodore Amiga komputerze. Wykorzystuje bardzo niezwykłą technikę wyrażania kolorów pikseli, dzięki czemu na ekranie pojawia się o wiele więcej kolorów, niż byłoby to możliwe w innym przypadku. Tryb HAM był powszechnie używany do wyświetlania cyfrowych zdjęć lub klatek wideo, grafiki bitmapowej i czasami animacji. W czasie premiery Amigi w 1985 roku, ten niemal fotorealistyczny wyświetlacz był bezprecedensowy jak na komputer domowy i był szeroko stosowany do demonstrowania możliwości graficznych Amigi. Jednak HAM ma istotne ograniczenia techniczne, które uniemożliwiają wykorzystanie go jako trybu wyświetlania ogólnego przeznaczenia.

Tło

Oryginalny chipset Amigi używa płaskiego wyświetlacza z 12-bitową przestrzenią kolorów RGB, która daje 4096 możliwych kolorów.

Bitmapa pola gry była przechowywana w sekcji pamięci głównej znanej jako chip RAM , która była współdzielona przez system wyświetlania i główny procesor . System wyświetlania zwykle wykorzystywał indeksowany system kolorów z paletą kolorów .

Sprzęt zawierał 32 rejestry, które można było ustawić na dowolny z 4096 możliwych kolorów, a obraz mógł uzyskać dostęp do 32 wartości przy użyciu 5 bitów na piksel. Szósty dostępny bit może być używany przez tryb wyświetlania znany jako Extra Half-Brite, który zmniejsza jasność tego piksela o połowę, zapewniając łatwy sposób na uzyskanie efektów cieniowania.

Tryb wstrzymania i modyfikacji

Chipset Amigi został zaprojektowany przy użyciu modelu kolorów HSV ( odcień , nasycenie i jasność ), co było typowe dla wczesnych komputerów domowych i konsol do gier, które do wyświetlania opierały się na telewizorach . HSV odwzorowuje bardziej bezpośrednio przestrzeń kolorów YUV używaną przez kolorowe telewizory NTSC i PAL , co wymaga prostszej elektroniki konwersji w porównaniu z kodowaniem RGB .

Telewizja kolorowa, gdy jest przesyłana przez łącze RF lub kompozytowe łącze wideo, wykorzystuje znacznie zmniejszoną przepustowość chromatyczną (zakodowaną jako dwa składniki różnicujące kolory, a nie odcień + nasycenie) w porównaniu z trzecim składnikiem, luma . To znacznie zmniejsza pamięć i przepustowość wymaganą dla danej postrzeganej wierności wyświetlania, poprzez przechowywanie i przesyłanie luminancji w pełnej rozdzielczości, ale chrominancji w stosunkowo niższej rozdzielczości – technika ta jest dzielona z technikami kompresji obrazu, takimi jak JPEG i MPEG , a także w inne tryby wideo oparte na HSV/YUV, takie jak kodowanie YJK układu V9958 MSX-Video (pierwsze użycie w MSX2+ ).

Wariant kodowania HSV stosowany w oryginalnej formie HAM pozwolił na nadanie priorytetu aktualizacji informacji o luminancji w stosunku do odcienia, a zwłaszcza nasycenia, w razie potrzeby przełączając się między trzema komponentami, w porównaniu z bardziej regularnym przeplataniem luma w pełnej rozdzielczości (Y) z indywidualnym Barwy o połówkowej lub ćwiartkowej rozdzielczości (U + V) używane w późniejszych cyfrowych standardach wideo. Dało to znaczne korzyści w zakresie wydajności w porównaniu z RGB.

Wraz z migracją Amigi z konsoli do gier do bardziej ogólnego domowego komputera , chipset wideo został zmieniony z HSV na nowoczesny model kolorów RGB , pozornie negując wiele korzyści płynących z trybu HAM. Kierownik projektu Amiga, Jay Miner, relacjonuje:

Hold and Modify przyjechałem z wycieczki, aby zobaczyć symulatory lotu w akcji i miałem pewien pomysł na prymitywny rodzaj wirtualnej rzeczywistości . NTSC na chipie oznaczało, że możesz utrzymać odcień i zmienić luminancję, zmieniając tylko cztery bity. Kiedy przeszliśmy na RGB, powiedziałem, że nie jest to już potrzebne, ponieważ nie jest przydatne i poprosiłem faceta od układu chipów, aby go zdjął. Wrócił i powiedział, że albo pozostawi to dużą dziurę w środku chipa, albo zajmie trzymiesięczne przeprojektowanie, a nie możemy tego zrobić. Nie sądziłem, że ktokolwiek go użyje. Znowu się pomyliłem, ponieważ to naprawdę dało Amidze przewagę pod względem palety kolorów.

Ostateczna forma Hold-And-Modify była pod względem sprzętowym funkcjonalnie taka sama jak oryginalna koncepcja HSV, ale zamiast operować na tych trzech komponentach opisowych (głównie priorytetyzując komponent V), modyfikuje jeden z trzech kanałów kolorów RGB . HAM można uznać za technikę kompresji stratnej , podobną w działaniu i wydajności do JPEG bez etapu DCT ; w trybie HAM6 efektywne pole gry z 4096 kolorami (12-bitów) jest zakodowane w połowie pamięci, która normalnie byłaby wymagana - a HAM8 zmniejsza to jeszcze bardziej, do około 40%. Ta uproszczona kompresja ma jednak swoją korzyść: większą ogólną wierność kolorów uzyskuje się kosztem artefaktów poziomych, spowodowanych niemożnością ustawienia dowolnego pojedynczego piksela na dowolną wartość 12- (lub 18, 24) bitową. W skrajnym przypadku zmiana koloru z jednego koloru na inny może zająć trzy piksele, zmniejszając efektywną rozdzielczość w tym punkcie z trybu „320-pikselowego” do około „106-pikselowego” i powodując, że smugi i cienie rozprzestrzeniają się wzdłuż linii skanowania na prawo od cechy o wysokim kontraście, jeśli 16 dostępnych rejestrów palet okazuje się niewystarczające.

"Dekompresja" przestrzeni kolorów zakodowanej w technologii HAM jest osiągana w czasie rzeczywistym przez sprzęt wyświetlający, gdy wyświetlane są dane bufora graficznego. Każdy zakodowany piksel działa albo jako normalny indeks rejestrów palety kolorów, albo jako polecenie do bezpośredniej zmiany wartości przechowywanej w wyjściowym przetworniku cyfrowo-analogowym (coś jak aktualizacja tylko jednej trzeciej rejestru aktywnej palety) i jest natychmiast wykonywany jako takie jak przechodzi przez chipset.

Stosowanie

Gdy Amiga została wprowadzona na rynek w 1985 roku, tryb HAM oferował znaczną przewagę nad konkurencyjnymi systemami. HAM umożliwia wyświetlanie wszystkich 4096 kolorów jednocześnie, jednak z powyższymi ograniczeniami. Ten pseudo-fotorealistyczny wyświetlacz był bezprecedensowy dla domowego komputera tamtych czasów i umożliwiał wyświetlanie zdigitalizowanych zdjęć i renderowanych obrazów 3D. Dla porównania, ówczesny standard IBM-PC EGA pozwalał na 16 kolorów na ekranie z palety 64. Następca EGA VGA wydany w 1987 roku ze swoim flagowym trybem gier, Mode 13h , pozwalał na 256 kolorów na ekranie z 262.144. Tryb HAM był często używany do zademonstrowania możliwości Amigi na wystawach sklepowych i prezentacjach handlowych, ponieważ konkurencyjny sprzęt nie był w stanie dorównać głębi kolorów. Ze względu na opisane powyżej ograniczenia HAM był używany głównie do wyświetlania statycznych obrazów, a programiści w dużej mierze unikali jego używania w grach lub aplikacjach wymagających animacji.

Wraz z wprowadzeniem Architektury Zaawansowanej Grafiki konwencjonalny obraz planarny może mieć paletę 256 kolorów, oferując znacznie wyższą wierność kolorów. Oryginalny tryb HAM z ograniczoną rozdzielczością kolorów stał się znacznie mniej atrakcyjny dla użytkowników maszyny AGA, chociaż nadal był uwzględniany w celu zapewnienia kompatybilności wstecznej. Nowy tryb HAM8 był znacznie mniej przydatny dla chipsetu AGA niż tryb HAM dla oryginalnego chipsetu, ponieważ prostsze, indeksowane 256-kolorowe tryby (jak również wyższa wydajność, planarne 128- i 64-kolorowe) znacznie zwiększyły opcje do artysty bez cierpienia z powodu wad HAM. Dobrze zaprogramowany tryb "sliced"-palette może okazać się bardziej przydatny niż HAM8, z maksymalnie 256 unikalnymi kolorami na linię - wystarczy, aby bezpośrednio zdefiniować odrębny kolor dla każdego piksela, jeśli zdefiniowano tryb wideo o szerokości 256 pikseli, a w wyższych rozdzielczościach nawet pojedyncza paleta 256 kolorów dla całego ekranu, nie mówiąc już o każdej linii, pozwoliła na znacznie bardziej efektywną i dokładną symulację wyższych głębi kolorów przy użyciu ditheringu, niż można by osiągnąć przy użyciu tylko 32.

Pierwotny cel HAM, który polegał na umożliwieniu większej rozdzielczości kolorów pomimo ograniczonego rozmiaru bufora wideo i ograniczonej przepustowości pamięci, stał się w dużej mierze nieistotny dzięki zniesieniu tych ograniczeń. Ponieważ bardziej nowoczesne komputery są z natury zdolne do wyświetlania prawdziwych kolorów w wysokiej rozdzielczości bez żadnych specjalnych sztuczek, nie ma już potrzeby stosowania technik wyświetlania, takich jak HAM; jako że karty graficzne w stylu PC, oferujące takie tryby jak 800x600 SVGA w wysokich kolorach (16 bpp lub 65536 kolorów wybieranych bezpośrednio) były już dostępne dla Amigi w ostatnich dniach platformy, jest mało prawdopodobne, aby dalszy rozwój technika byłaby kłopotliwa, gdyby przetrwała do dnia dzisiejszego.

Ograniczenia

Image
Przykład obramowania kolorów HAM: biały i czarny są w palecie, pozostałe kolory nie, więc wymagają przejścia poziomego.

Tryb HAM nakłada ograniczenia na wartość sąsiednich pikseli na każdej poziomej linii pola gry. Aby renderować dwa dowolne kolory obok siebie, zmiana koloru na zamierzony może zająć do dwóch pikseli pośrednich (jeśli wszystkie składniki czerwony, zielony i niebieski muszą zostać zmodyfikowane). W najgorszym przypadku zmniejsza to poziomą użyteczną rozdzielczość chrominancji o połowę, z 320~360 pikseli do 106~120. Mimo to wypada korzystnie w porównaniu ze współczesnymi technologiami wideo, takimi jak VHS , które mają rozdzielczość chrominancji około 40 linii telewizyjnych , w przybliżeniu odpowiadającą 80 pikselom.

Wyświetlanie takich obrazów przez kompozytowe połączenie wideo zapewnia pewne wygładzanie poziome, które minimalizuje artefakty kolorów. Ale jeśli używany jest monitor RGB , artefakty stają się szczególnie widoczne w obszarach o dużym kontraście (silne poziome gradienty obrazu ), gdzie może pojawić się niepożądany wielobarwny artefakt lub „frędzle”. Zastosowano różne techniki renderowania, aby zminimalizować wpływ „frędzli”, a wyświetlacze HAM często projektowano tak, aby zawierały subtelne poziome gradienty kolorów, unikając pionowych krawędzi i kontrastów.

Wyświetlanie pełnokolorowego obrazu w trybie HAM wymaga starannego wstępnego przetworzenia. Ponieważ HAM może modyfikować tylko jeden ze składników RGB na raz, szybkie przejścia kolorów wzdłuż linii skanowania można najlepiej osiągnąć, używając jednego z wstępnie ustawionych rejestrów kolorów dla tych przejść. Aby wyrenderować dowolny obraz, programista może najpierw zbadać oryginalny obraz pod kątem najbardziej zauważalnych z tych przejść, a następnie przypisać te kolory do jednego z rejestrów, technika znana jako palety adaptacyjne . Jednak przy zaledwie 16 dostępnych rejestrach w oryginalnym trybie HAM, powszechna jest pewna utrata wierności kolorów.

Dodatkowo tryb HAM nie pozwala łatwo na dowolną animację wyświetlacza. Na przykład, jeśli dowolna część pola gry ma zostać przesunięta do innej pozycji na ekranie, wartości Hold-and-Modify mogą wymagać ponownego obliczenia dla wszystkich linii źródłowych i docelowych w celu prawidłowego wyświetlenia obrazu (operacja nie dobrze nadaje się do animacji). W szczególności, jeśli skrajna lewa krawędź animowanego obiektu zawiera jakiekolwiek piksele „modyfikacji” lub jeśli obraz znajdujący się bezpośrednio po prawej stronie obiektu zawiera piksele „modyfikacji”, wówczas te wartości typu „Wstrzymaj i modyfikuj” muszą zostać przeliczone. Próba przesunięcia obiektu po ekranie (np. za pomocą blittera ) spowoduje powstanie zauważalnych obwódek przy lewej i prawej krawędzi tego obrazu, chyba że grafika została specjalnie zaprojektowana, aby tego uniknąć. Aby uniknąć ponownego obliczania wartości „Wstrzymaj i zmodyfikuj” i obejścia obramowania, programista musiałby upewnić się, że najbardziej lewy piksel każdego obiektu blitter, a najbardziej lewy piksel każdej linii przewijanego pola gry jest pikselem „ustawionym”. Paleta musiałaby być zaprojektowana tak, aby zawierała każdy taki skrajny lewy piksel. Alternatywnie wyświetlacz HAM może być animowany poprzez generowanie wartości pikseli poprzez generowanie proceduralne , chociaż jest to generalnie przydatne tylko w przypadku obrazów syntetycznych, na przykład efektów „tęczy” używanych w demonstracjach .

Pamiętaj jednak, że funkcja „Wstrzymaj i zmodyfikuj” dotyczy tylko pikseli pola gry. 128 pikseli danych sprite (w trybie DMA) na linię skanowania jest nadal dostępnych do umieszczenia na polu gry HAM.

Realizacje

Oryginalny tryb HAM Chip Set (HAM6)

Tryb HAM6, nazwany od 6 bitów danych na piksel, został wprowadzony w oryginalnym zestawie chipsetów i zachowany w późniejszym rozszerzonym zestawie układów i zaawansowanej architekturze graficznej . HAM6 umożliwia jednoczesne wyświetlanie do 4096 kolorów w rozdzielczościach od 320×200 do 360×576.

Kodowanie HAM6 wykorzystuje sześć bitów na piksel: dwa bity na kontrolę i cztery bity na dane. Jeżeli oba bity kontrolne są ustawione na zero, pozostałe cztery bity są używane do indeksowania jednego z 16 wstępnie ustawionych rejestrów kolorów, działając w sposób normalny indeksowanej mapy bitowej. Pozostałe trzy możliwe wzorce bitów kontrolnych wskazują, że należy użyć koloru poprzedniego piksela (po lewej) na linii skanowania, a zamiast tego należy użyć bitów danych do modyfikacji wartości składowej czerwonej, zielonej lub niebieskiej. W związku z tym istnieją cztery możliwości:

  • Set : Użyj 4 bitów danych, aby zindeksować kolor z palety 16 kolorów. Użyj tego koloru dla tego piksela.
  • Modyfikuj czerwony : Przytrzymaj zielone i niebieskie komponenty poprzedniego piksela. Użyj 4 bitów danych jako nowego składnika koloru czerwonego tego piksela.
  • Modyfikuj zielony : Przytrzymaj czerwone i niebieskie komponenty poprzedniego piksela. Użyj 4 bitów danych jako nowego składnika koloru zielonego tego piksela.
  • Modyfikuj niebieski : zatrzymaj składowe koloru czerwonego i zielonego poprzedniego piksela. Użyj 4 bitów danych jako nowego składnika koloru niebieskiego tego piksela.

Dostępny jest też podobny tryb, HAM5, ale jest on raczej bezużyteczny. W HAM5 szósty bit jest zawsze zerem, więc tylko składnik koloru niebieskiego może być modyfikowany.

Tryb krojonej szynki (SHAM)

Oryginalny chipset Amigi zawierał układ pomocniczy znany jako „Copper”, który obsługuje przerwania i inne obowiązki związane z synchronizacją i porządkiem niezależnie od procesora i systemu wideo. Używając Copper, możliwe jest modyfikowanie rejestrów chipsetu lub przerwanie pracy procesora w dowolnej współrzędnej wyświetlania synchronicznie z wyjściem wideo. Pozwala to programistom na użycie kodu Copperlist lub kodu procesora do efektów wideo z bardzo niskim obciążeniem.

Korzystając z tej techniki, programiści opracowali tryb Sliced ​​HAM lub SHAM , znany również jako dynamiczny HAM . SHAM zmienia niektóre lub wszystkie rejestry kolorów na wybranych liniach skanowania, aby zmienić paletę podczas wyświetlania. Oznaczało to, że każda linia skanowania może mieć swój własny zestaw 16 podstawowych kolorów. Usuwa to pewne ograniczenia spowodowane ograniczoną paletą, które można następnie wybrać dla linii zamiast dla obrazu. Jedynymi wadami tego podejścia są to, że Copperlist wykorzystuje dodatkowe cykle zegara pamięci RAM dla zmian rejestru, że obraz nie jest tylko bitmapą, oraz dodatkowa złożoność konfiguracji trybu SHAM.

Ta technika nie ogranicza się do HAM i była szeroko stosowana również w bardziej konwencjonalnych trybach graficznych maszyny. Dynamic HiRes wykorzystuje podobną technikę zmiany palety, aby uzyskać 16 kolorów na linię w trybach wysokiej rozdzielczości, podczas gdy HAM jest ograniczony do niskiej rozdzielczości, ale pozwala zarówno na 16 indeksowanych kolorów, jak i na ich modyfikacje.

Pomysł SHAM został przestarzały, gdy HAM8 został wprowadzony z chipsetem AGA , ponieważ nawet niepokrojony obraz HAM8 ma znacznie większą rozdzielczość kolorów niż pocięty obraz HAM6. Jednak SHAM pozostaje najlepszym dostępnym trybem HAM na tych Amigach z oryginalnymi chipsetami lub ECS.

Tryb HAM zaawansowanej architektury graficznej (HAM8)

Wraz z wydaniem architektury Advanced Graphics Architecture (AGA) w 1992 roku, oryginalny tryb HAM został przemianowany na „HAM6” i wprowadzono nowy tryb „HAM8” (numerowany przyrostek reprezentuje bitplany używane przez odpowiedni tryb HAM). Z AGA, zamiast 4 bitów na składnik koloru, Amiga miała teraz do 8 bitów na składnik koloru, co dało 16 777 216 możliwych kolorów (24-bitowa przestrzeń kolorów ).

HAM8 działa w taki sam sposób jak HAM6, używając dwóch „kontrolnych” bitów na piksel, ale z sześcioma bitami danych na piksel zamiast czterech. Operacja set wybiera z palety 64 kolorów zamiast 16. Operacja modyfikacji modyfikuje sześć najbardziej znaczących bitów składowych koloru czerwonego, zielonego lub niebieskiego - dwa najmniej znaczące bity koloru nie mogą być zmienione tą operacją i pozostają zgodnie z ostatnią operacją ustawiania. W porównaniu do HAM6, HAM8 może wyświetlać o wiele więcej kolorów na ekranie. Powszechnie zgłaszano, że maksymalna liczba kolorów na ekranie przy użyciu HAM8 wynosi 262,144 kolory (18-bitowa przestrzeń kolorów RGB). W rzeczywistości maksymalna liczba unikalnych kolorów na ekranie może być większa niż 262,144, w zależności od dwóch najmniej znaczących bitów każdego składnika koloru w palecie 64 kolorów. Teoretycznie wszystkie 16,7 miliona kolorów można wyświetlić na odpowiednio dużym ekranie i odpowiedniej palecie bazowej, ale w praktyce ograniczenia w osiąganiu pełnej precyzji oznaczają, że dwa najmniej znaczące bity są zazwyczaj ignorowane. Ogólnie rzecz biorąc, postrzegana głębia kolorów HAM8 jest z grubsza odpowiednikiem wyświetlacza o wysokiej kolorystyce .

Rozdzielczości wyświetlania w pionie dla HAM8 są takie same jak dla HAM6. Rozdzielczość pozioma może wynosić 320 (360 z overscan), jak poprzednio, podwojona do 640 (720 z overscan) lub nawet czterokrotnie do 1280 pikseli (1440 z overscan). Chipset AGA wprowadził również jeszcze wyższe rozdzielczości dla tradycyjnych trybów wyświetlania planarnego. Całkowita liczba pikseli w obrazie HAM8 nie może przekroczyć 829 440 (1440 × 576) przy użyciu trybów PAL, ale może przekroczyć 1 310 720 (1280 × 1024) przy użyciu sprzętu wyświetlającego innej firmy (Indivision AGA flicker-fixer ).

Podobnie jak w oryginalnym trybie HAM, ekran HAM8 nie może wyświetlać dowolnego koloru w dowolnej dowolnej pozycji, ponieważ każdy piksel opiera się albo na ograniczonej palecie, albo na maksymalnie dwóch składnikach koloru poprzedniego piksela. Podobnie jak w przypadku oryginalnego trybu HAM, projektanci mogą również zdecydować się na „pokrojenie” wyświetlacza (patrz poniżej) w celu obejścia niektórych z tych ograniczeń. Dostępny jest również tryb HAM7, ale nie jest on powszechnie używany.

Emulacja szynki

HAM jest unikalny dla Amigi i jej odrębnych chipsetów. Aby umożliwić bezpośrednie renderowanie starszych obrazów zakodowanych w formacie HAM, opracowano programowe emulatory HAM, które nie wymagają oryginalnego sprzętu wyświetlającego. Wersje AmigaOS starsze niż 4.0 mogą używać trybu HAM w obecności natywnego chipsetu Amigi. AmigaOS 4.0 i nowszy, zaprojektowany dla radykalnie innego sprzętu, zapewnia emulację HAM do użytku na nowoczesnym, masywnym sprzęcie graficznym. Dedykowane emulatory Amigi działające na sprzęcie innym niż natywny są w stanie wyświetlać tryb HAM poprzez emulację sprzętu wyświetlającego. Ponieważ jednak żadna inna architektura komputerowa nie wykorzystywała techniki HAM, przeglądanie obrazu HAM na dowolnej innej architekturze wymaga programowej interpretacji pliku obrazu. Wierne dekodowanie oparte na oprogramowaniu da identyczne wyniki, odkładając na bok różnice w wierności kolorów między konfiguracjami wyświetlania.

Jeśli jednak celem jest jedynie wyświetlenie obrazu SHAM na platformie innej niż Amiga, wymagane wartości kolorów mogą być wstępnie obliczone na podstawie wpisów palety zaprogramowanych za pomocą listy miedzianej, niezależnie od tego, czy paleta jest modyfikowana w środek linii skanu. Zawsze istnieje możliwość bezstratnej konwersji obrazu HAM lub SHAM do 32-bitowej palety.

Wdrożenia HAM innych firm

Urządzenie wyprodukowane przez Black Belt, znane jako HAM-E, było w stanie wytworzyć obrazy z głębią kolorów HAM8 przy niskiej rozdzielczości poziomej z Amigi z oryginalnym chipsetem.

Amiga byłaby skonfigurowana do produkcji obrazów o wysokiej rozdzielczości (640 pikseli szerokości, 720 z overscan). Wymagało to użycia czterech bitplanów przy 70 ns na piksel. Pierwsze kilka wierszy obrazu zakodowanych informacji do konfiguracji jednostki HAM-E. Następnie każda para pikseli została zakodowana z informacją dla jednostki HAM-E, która zamieniła informacje na jeden piksel 140 ns (generując obraz o szerokości 320 pikseli lub 360 z overscan, przy głębi kolorów ośmiu bitplanów). Jakość HAM-E była więc porównywalna z obrazem HAM8 o niskiej rozdzielczości. W technice HAM-E wykorzystano fakt, że obraz o wysokiej rozdzielczości z czterema bitplanami zapewnia o jedną trzecią większą przepustowość pamięci, a zatem o jedną trzecią więcej danych, niż obraz o niskiej rozdzielczości z sześcioma bitplanami.

Zobacz też

Bibliografia

Dalsza lektura

  • Specyfikacja zaawansowanego chipsetu amigowego (AA) Commodore-Amiga

Zewnętrzne linki