Let's Emu!

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 13:20, 30 cze 2015
KMK (Dyskusja | wkład)
(Kompatybilność)
← Previous diff
Aktualna wersja
KMK (Dyskusja | wkład)
(Zalecana konfiguracja sprzętowa)
Linia 16: Linia 16:
* [[Rapidus Accelerator|karta Rapidus]] * [[Rapidus Accelerator|karta Rapidus]]
* [[VBXE]] * [[VBXE]]
-* [[Evie]] lub [[SONari]]+* [[Evie]], [[SONari]] lub stereo [[POKEY]]
* szybki twardy dysk * szybki twardy dysk
* [[SpartaDOS X]] * [[SpartaDOS X]]
Linia 22: Linia 22:
Program został napisany dla karty [[Rapidus Accelerator|Rapidus]], ale nie jest ona niezbędnie konieczna do jego działania: ''Let's Emu!'' można np. uruchomić pod emulatorem [[Altirra]] (niemniej po wykryciu karty Rapidus wykorzystywane są jej niektóre specyficzne możliwości). Program został napisany dla karty [[Rapidus Accelerator|Rapidus]], ale nie jest ona niezbędnie konieczna do jego działania: ''Let's Emu!'' można np. uruchomić pod emulatorem [[Altirra]] (niemniej po wykryciu karty Rapidus wykorzystywane są jej niektóre specyficzne możliwości).
-Bez VBXE brak jest atrybutów koloru ZX Spectrum. Układ [[PSG (układ)|PSG]] znajdujący się w Evie lub SONari jest pod emulatorem widoczny jako przystawka z układem AY-3-8910.+Bez VBXE brak jest atrybutów koloru ZX Spectrum (bez tego niektóre programy - np. gra [https://en.wikipedia.org/wiki/The_Trap_Door_%28video_game%29 Trap Door] - są bezużyteczne).
-SpartaDOS X pozwala zarejestrować program jako "przeglądarkę" do plików (tzw. snapszotów) zawierających programy na ZX Spectrum. Natomiast twardy dysk znacznie usprawnia całą zabawę: pliki snapszotów mają po kilkadziesiąt KB, sam plik wykonywalny emulatora też nie ułomek (75 KB), a z twardego dysku na [[PBI]] to wszystko ładuje się w kilka sekund.+Układ [[PSG (układ)|PSG]] znajdujący się w Evie lub SONari jest pod emulatorem widoczny jako przystawka z układem AY-3-8910. Jeśli taka przystawka nie jest dostępna, ale jeśli komputer zawiera rozszerzenie [[stereo]] dla POKEY-a, program wykorzysta je do odtwarzania utworów ułożonych dla układu AY. Układ AY nie jest jednak syntezowany, dlatego generowany dźwięk będzie w takim wypadku tylko lepszym lub gorszym przybliżeniem oryginału.
 + 
 +SpartaDOS X pozwala zarejestrować program jako "przeglądarkę" do plików (tzw. snapszotów) zawierających programy na ZX Spectrum. Natomiast twardy dysk znacznie usprawnia całą zabawę: pliki snapszotów mają po kilkadziesiąt KB, sam plik wykonywalny emulatora też nie ułomek (92 KB), a z twardego dysku na [[PBI]] to wszystko ładuje się w kilka sekund.
== Kompatybilność == == Kompatybilność ==
-Program emuluje podstawowy model ZX Spectrum, tj. ZX Spectrum 48k. Procesor [https://pl.wikipedia.org/wiki/Zilog_Z80 Z80] i w ogóle cała maszyna emulowana jest dość wiernie (na tyle, że bez zakłóceń działa np. Sinclair BASIC), za wyjątkiem dwóch rzeczy:+Program emuluje podstawowy model ZX Spectrum, tj. ZX Spectrum 48k. Procesor [https://pl.wikipedia.org/wiki/Zilog_Z80 Z80] i w ogóle cała maszyna emulowana jest dość wiernie (na tyle, że bez zakłóceń działa np. Sinclair BASIC), są jednak wyjątki wynikające z uproszczeń w kodzie emulatora:
 +* odczyt pamięci kolorów odbywa się raz na [[ramka|ramkę]] (a nie, jak w oryginale, co linię skaningową)
* nie jest dokładnie emulowany rejestr R procesora * nie jest dokładnie emulowany rejestr R procesora
* czas wykonywania poszczególnych rozkazów emulowanego Z80 ma niewiele wspólnego z tymże czasem na "prawdziwym" CPU: emulator wykonuje rozkazy tak szybko, jak potrafi, ale nie zachowuje np. ich wzajemnych zależności czasowych * czas wykonywania poszczególnych rozkazów emulowanego Z80 ma niewiele wspólnego z tymże czasem na "prawdziwym" CPU: emulator wykonuje rozkazy tak szybko, jak potrafi, ale nie zachowuje np. ich wzajemnych zależności czasowych
Linia 35: Linia 38:
To ostatnie powoduje słyszalne kłopoty w przypadku np. gier odtwarzających muzykę na beeperze, w której długości i częstotliwości nut mierzone są przez pętle opóźniające. Z tego samego powodu trudno jest dokładnie ocenić wydajność emulacji Z80, bo emulator różne zestawy rozkazów może wykonywać z różną szybkością - ale średnio wychodzi ok. 100% oryginału na 65C816 pracującym z częstotliwością 20 MHz. To ostatnie powoduje słyszalne kłopoty w przypadku np. gier odtwarzających muzykę na beeperze, w której długości i częstotliwości nut mierzone są przez pętle opóźniające. Z tego samego powodu trudno jest dokładnie ocenić wydajność emulacji Z80, bo emulator różne zestawy rozkazów może wykonywać z różną szybkością - ale średnio wychodzi ok. 100% oryginału na 65C816 pracującym z częstotliwością 20 MHz.
-Pod emulatorem bardzo szybkie są rozkazy przesłań blokowych Z80 (np. LDIR), bo program używa rozkazów przesłań blokowych 65C816 (MVN i MVP), które przy zegarze 20 MHz są ok. 10x szybsze niż ich odpowiedniki z Z80/3,5 MHz. Z tego powodu istnieje przynajmniej jeden program, który pod emulatorem działa zupełnie dobrze już przy 7 MHz, a przy wyższych częstotliwościach zegara jest po prostu za szybki - jest to gra ''Jet Set Willy''.+Pod emulatorem bardzo szybkie są rozkazy przesłań blokowych Z80 (np. LDIR), bo program używa rozkazów przesłań blokowych 65C816 (MVN i MVP), które przy zegarze 20 MHz są ok. 17x szybsze niż ich odpowiedniki z Z80/3,5 MHz. Z tego powodu istnieje przynajmniej jeden program, który pod emulatorem działa zupełnie dobrze już przy 7 MHz, a przy wyższych częstotliwościach zegara jest po prostu za szybki - jest to gra ''Jet Set Willy''.
Na nieco szybszy od oryginału wygląda też Sinclair BASIC (aczkolwiek do pomiarów, z braku oryginału, użyto emulatora [https://en.wikipedia.org/wiki/Fuse_(emulator) Fuse]): Na nieco szybszy od oryginału wygląda też Sinclair BASIC (aczkolwiek do pomiarów, z braku oryginału, użyto emulatora [https://en.wikipedia.org/wiki/Fuse_(emulator) Fuse]):
-<table border=1 cellpadding=5><tr><td><center><b>Program</b></center></td><td><center><b>Fuse</b></center></td><td><center><b>Let's Emu!<br>(Rapidus, 20 MHz)</b></center></td></tr>+<table border=1 cellpadding=5>
 +<tr>
 +<td><center><b>Program</b></center></td>
 +<td><center><b>Fuse (PC)</b></center></td>
 +<td><center><b>Let's Emu!<br>(Rapidus, 20 MHz)</b></center></td>
 +<td><center><b>Let's Emu!<br>(Altirra 2.50, 21,27 MHz)</b></center></td>
 +<td><center><b>Let's Emu!<br>([[XL14]], 14,32 MHz)</b></center></td>
 +</tr>
<tr><td> <tr><td>
<pre> <pre>
-10 FOR x=1 to 1000+10 FOR x=1 TO 1000
20 PRINT AT 10,10;x 20 PRINT AT 10,10;x
30 NEXT x 30 NEXT x
</pre> </pre>
</td> </td>
-<td>19 sek.</td><td>17 sek.</td></tr>+<td>19 sek.</td>
 +<td>17 sek.</td>
 +<td>16 sek.</td>
 +<td>35,9 sek.</td>
 +</tr>
<tr><td> <tr><td>
<pre> <pre>
-10 FOR x=1 to 10000+10 FOR x=1 TO 10000
20 NEXT x 20 NEXT x
</pre> </pre>
</td> </td>
-<td>43 sek.</td><td>34 sek.</td></tr>+<td>43 sek.</td>
 +<td>34 sek.</td>
 +<td>34 sek.</td>
 +<td>77,3 sek.</td>
 +</tr>
 +<tr><td>
 +<pre>
 +10 FOR x=1 TO 6
 +20 BEEP 10,0
 +30 NEXT x
 +</pre>
 +</td>
 +<td>60 sek.</td>
 +<td>66 sek.</td>
 +<td>64 sek.</td>
 +<td>143,5 sek.</td>
 +</tr>
</table> </table>
Linia 63: Linia 93:
Emulator umie załadować programy w następujących formatach: Emulator umie załadować programy w następujących formatach:
-* plik ROM: "kartridż" o wielkości 16k zastępujący oryginalny ROM ZX Spectrum+* plik ROM: "kartridż" o wielkości 8 lub 16k zastępujący oryginalny ROM ZX Spectrum
* plik SNA: nieskompresowany zrzut 48k pamięci * plik SNA: nieskompresowany zrzut 48k pamięci
* plik Z80: skompresowany zrzut 48k pamięci (obsługiwane są wersje formatu v1, v2 i v3) * plik Z80: skompresowany zrzut 48k pamięci (obsługiwane są wersje formatu v1, v2 i v3)
 +* plik TAP: zawartość standardowej taśmy z programem dla ZX Spectrum (od wersji 0.9.2)
 +* plik AY: plik wykonywalny grający muzyczkę skomponowaną dla ZX Spectrum (od wersji 0.9.7).
Bieżącą zawartość pamięci emulatora można też zapisać do pliku w formacie Z80 (v2). Bieżącą zawartość pamięci emulatora można też zapisać do pliku w formacie Z80 (v2).
Linia 71: Linia 103:
== Klawiszologia == == Klawiszologia ==
-Program obsługiwany jest z menu widocznego na obrazku. Poza tym do dyspozycji klawisze konsoli:+Program obsługiwany jest z menu widocznego na obrazku. Poza tym, w czasie pracy emulatora, pewne funkcje sterujące przypisane do klawiszy konsoli:
* START przerywa emulację i powoduje powrót do menu (lub do DOS-u, jeśli program uruchomiono w trybie "automatycznym", tzn. z parametrem /A w wierszu poleceń) * START przerywa emulację i powoduje powrót do menu (lub do DOS-u, jeśli program uruchomiono w trybie "automatycznym", tzn. z parametrem /A w wierszu poleceń)
-* SELECT odpowiada klawiszowi Symbol Shift na klawiaturze ZX Spectrum 
* OPTION powoduje odwrócenie kolorów INK i PAPER (tylko wtedy, kiedy VBXE jest nieaktywne) * OPTION powoduje odwrócenie kolorów INK i PAPER (tylko wtedy, kiedy VBXE jest nieaktywne)
* HELP wyświetla ściągę z układem klawiatury ZX Spectrum * HELP wyświetla ściągę z układem klawiatury ZX Spectrum
 +
 +Funkcje głównej klawiatury przypisano następująco:
 +
 +<table border=1 cellpadding=5>
 +<tr>
 +<td><b>ZX Spectrum</b></td>
 +<td><b>Atari</b></td>
 +</tr>
 +
 +<tr>
 +<td>Break</td>
 +<td>Shift/Space</td>
 +</tr>
 +
 +<tr>
 +<td>Caps</td>
 +<td>Caps</td>
 +</tr>
 +
 +<tr>
 +<td>Caps Shift</td>
 +<td>Shift</td>
 +</tr>
 +
 +<tr>
 +<td>Delete</td>
 +<td>Bk Sp</td>
 +</tr>
 +
 +<tr>
 +<td>Enter</td>
 +<td>Return</td>
 +</tr>
 +
 +<tr>
 +<td>Extended Mode</td>
 +<td>Esc (lub Shift/SELECT)</td>
 +</tr>
 +
 +<tr>
 +<td>Inverse video</td>
 +<td>Inverse</td>
 +</tr>
 +
 +<tr>
 +<td>Symbol Shift</td>
 +<td>Control (lub SELECT)</td>
 +</tr>
 +
 +<tr>
 +<td>True video</td>
 +<td>Shift/Inverse</td>
 +</tr>
 +
 +</table>
 +
 +Dla ułatwienia korzystania z klawiatury, znaki <code>,./;+*-=<></code> oraz <code>?:_^</code>, a także funkcje przesuwania kursora można wywoływać na dwa sposoby: albo przy użyciu odpowiednich kombinacji klawiszy ZX Spectrum, albo wciskając klawisz bądź kombinację klawiszy, którymi wywołuje się daną funkcję (lub dany znak) z klawiatury Atari.
 +
 +Np. znak zapytania (?) znajduje się na klawiaturze ZX Spectrum pod klawiszem [C]: żeby go wywołać na ekran, trzeba wcisnąć kombinację klawiszy [Symbol Shift]+[C] - czyli, na klawiaturze Atari, odpowiednio [Control]+[C] lub [SELECT]+[C]. Ale tak poza tym można go również wywołać "metodą atarowską", tj. przez wciśnięcie klawiszy [Shift]+[?].
== Ciekawostki == == Ciekawostki ==
-* Program napisano na Atari, początkowo z kartą [[F7]] (10 MHz), potem z rozszerzeniem [[SIMMius 4 MB]] (1,77 MHz), na końcu z kartą [[Rapidus Accelerator|Rapidus]] (początkowo 16, potem 20 MHz). Wykorzystano [[MAE]] jako edytor, a kod źródłowy został zasemblowany (nieopublikowanym) asemblerem [[N16]] autorstwa KMK. Cały proces kompilacji ''Let's Emu!'' wymaga też SpartaDOS X w wersji co najmniej 4.47.+* Program napisano na Atari, początkowo z kartą [[F7]] (10,62 MHz), potem z rozszerzeniem [[SIMMius 4 MB]] (1,77 MHz), na końcu z kartą [[Rapidus Accelerator|Rapidus]] (początkowo 16, potem 20 MHz). Wykorzystano [[MAE]] jako edytor, a kod źródłowy został zasemblowany (nieopublikowanym) asemblerem [[N16]] autorstwa KMK. Cały proces kompilacji ''Let's Emu!'' wymaga też SpartaDOS X w wersji co najmniej 4.47.
* Konwersja atrybutów koloru robiona jest blitterem VBXE, z tego względu w praktyce nie zajmuje czasu CPU. * Konwersja atrybutów koloru robiona jest blitterem VBXE, z tego względu w praktyce nie zajmuje czasu CPU.
 +
 +* Objętość kodu programu emulacji całego ZX Spectrum 48k wynosi tylko nieco ponad 34 KB.
== Przykładowe gry == == Przykładowe gry ==
Linia 111: Linia 203:
== Odnośniki zewnętrzne == == Odnośniki zewnętrzne ==
-* [https://www.youtube.com/watch?v=0TpQC7afQDo Film prezentujący działanie emulatora]+* [https://www.youtube.com/watch?v=0TpQC7afQDo Film prezentujący działanie emulatora].
-* [http://drac030.krap.pl/wapniak-2012.flac Let's Emu! gra (na Evie) utwór z inwitra na Wapniaka 2012] (skomponowany przez [[Yerzmyey]]a na [[PSG]]).+* [http://drac030.krap.pl/shiru_restless_fighter.flac "Let's Emu!" gra (na Pokeyu) utwór "Restless Fighter"] (skomponowany przez Shiru na beeper). Dla porównania, oryginału można posłuchać [http://battleofthebits.org/arena/Entry/Restless+Fighter/4548/ tutaj].
 +* [http://drac030.krap.pl/wapniak-2012.flac "Let's Emu!" gra (na Evie) utwór z inwitra na Wapniaka 2012] (skomponowany przez [[Yerzmyey]]a na [[PSG]]).
[[Kategoria:Atari 8-bit]] [[Kategoria:Atari 8-bit]]

Aktualna wersja

Grafika:letsemu.png

Eksperymentalny emulator komputera Sinclair ZX Spectrum dla Atari wyposażonego w procesor 65C816. Autorem jest KMK.

Spis treści

Wymagania sprzętowe

  • procesor 65C816
  • dodatkowa pamięć liniowa o rozmiarze co najmniej 448k
  • DracOS (ze względu na funkcje zarządzania pamięcią liniową)

Joysticki Atari działają jako joysticki Kempston lub Sinclair. Wybór pomiędzy jednym a drugim systemem jest automatyczny, tj. pierwsze odwołanie do portu I/O joysticka Kempston wyłącza emulację joysticków Sinclair.

Zalecana konfiguracja sprzętowa

Program został napisany dla karty Rapidus, ale nie jest ona niezbędnie konieczna do jego działania: Let's Emu! można np. uruchomić pod emulatorem Altirra (niemniej po wykryciu karty Rapidus wykorzystywane są jej niektóre specyficzne możliwości).

Bez VBXE brak jest atrybutów koloru ZX Spectrum (bez tego niektóre programy - np. gra Trap Door - są bezużyteczne).

Układ PSG znajdujący się w Evie lub SONari jest pod emulatorem widoczny jako przystawka z układem AY-3-8910. Jeśli taka przystawka nie jest dostępna, ale jeśli komputer zawiera rozszerzenie stereo dla POKEY-a, program wykorzysta je do odtwarzania utworów ułożonych dla układu AY. Układ AY nie jest jednak syntezowany, dlatego generowany dźwięk będzie w takim wypadku tylko lepszym lub gorszym przybliżeniem oryginału.

SpartaDOS X pozwala zarejestrować program jako "przeglądarkę" do plików (tzw. snapszotów) zawierających programy na ZX Spectrum. Natomiast twardy dysk znacznie usprawnia całą zabawę: pliki snapszotów mają po kilkadziesiąt KB, sam plik wykonywalny emulatora też nie ułomek (92 KB), a z twardego dysku na PBI to wszystko ładuje się w kilka sekund.

Kompatybilność

Program emuluje podstawowy model ZX Spectrum, tj. ZX Spectrum 48k. Procesor Z80 i w ogóle cała maszyna emulowana jest dość wiernie (na tyle, że bez zakłóceń działa np. Sinclair BASIC), są jednak wyjątki wynikające z uproszczeń w kodzie emulatora:

  • odczyt pamięci kolorów odbywa się raz na ramkę (a nie, jak w oryginale, co linię skaningową)
  • nie jest dokładnie emulowany rejestr R procesora
  • czas wykonywania poszczególnych rozkazów emulowanego Z80 ma niewiele wspólnego z tymże czasem na "prawdziwym" CPU: emulator wykonuje rozkazy tak szybko, jak potrafi, ale nie zachowuje np. ich wzajemnych zależności czasowych

To ostatnie powoduje słyszalne kłopoty w przypadku np. gier odtwarzających muzykę na beeperze, w której długości i częstotliwości nut mierzone są przez pętle opóźniające. Z tego samego powodu trudno jest dokładnie ocenić wydajność emulacji Z80, bo emulator różne zestawy rozkazów może wykonywać z różną szybkością - ale średnio wychodzi ok. 100% oryginału na 65C816 pracującym z częstotliwością 20 MHz.

Pod emulatorem bardzo szybkie są rozkazy przesłań blokowych Z80 (np. LDIR), bo program używa rozkazów przesłań blokowych 65C816 (MVN i MVP), które przy zegarze 20 MHz są ok. 17x szybsze niż ich odpowiedniki z Z80/3,5 MHz. Z tego powodu istnieje przynajmniej jeden program, który pod emulatorem działa zupełnie dobrze już przy 7 MHz, a przy wyższych częstotliwościach zegara jest po prostu za szybki - jest to gra Jet Set Willy.

Na nieco szybszy od oryginału wygląda też Sinclair BASIC (aczkolwiek do pomiarów, z braku oryginału, użyto emulatora Fuse):

Program
Fuse (PC)
Let's Emu!
(Rapidus, 20 MHz)
Let's Emu!
(Altirra 2.50, 21,27 MHz)
Let's Emu!
(XL14, 14,32 MHz)
10 FOR x=1 TO 1000
20 PRINT AT 10,10;x
30 NEXT x
19 sek. 17 sek. 16 sek. 35,9 sek.
10 FOR x=1 TO 10000
20 NEXT x
43 sek. 34 sek. 34 sek. 77,3 sek.
10 FOR x=1 TO 6
20 BEEP 10,0
30 NEXT x
60 sek. 66 sek. 64 sek. 143,5 sek.

Ogólnie, pomijając skrajności, wydajność emulacji Z80 to około 17-18% oryginału.

Obsługiwane formaty plików

Emulator umie załadować programy w następujących formatach:

  • plik ROM: "kartridż" o wielkości 8 lub 16k zastępujący oryginalny ROM ZX Spectrum
  • plik SNA: nieskompresowany zrzut 48k pamięci
  • plik Z80: skompresowany zrzut 48k pamięci (obsługiwane są wersje formatu v1, v2 i v3)
  • plik TAP: zawartość standardowej taśmy z programem dla ZX Spectrum (od wersji 0.9.2)
  • plik AY: plik wykonywalny grający muzyczkę skomponowaną dla ZX Spectrum (od wersji 0.9.7).

Bieżącą zawartość pamięci emulatora można też zapisać do pliku w formacie Z80 (v2).

Klawiszologia

Program obsługiwany jest z menu widocznego na obrazku. Poza tym, w czasie pracy emulatora, pewne funkcje sterujące przypisane są do klawiszy konsoli:

  • START przerywa emulację i powoduje powrót do menu (lub do DOS-u, jeśli program uruchomiono w trybie "automatycznym", tzn. z parametrem /A w wierszu poleceń)
  • OPTION powoduje odwrócenie kolorów INK i PAPER (tylko wtedy, kiedy VBXE jest nieaktywne)
  • HELP wyświetla ściągę z układem klawiatury ZX Spectrum

Funkcje głównej klawiatury przypisano następująco:

ZX Spectrum Atari
Break Shift/Space
Caps Caps
Caps Shift Shift
Delete Bk Sp
Enter Return
Extended Mode Esc (lub Shift/SELECT)
Inverse video Inverse
Symbol Shift Control (lub SELECT)
True video Shift/Inverse

Dla ułatwienia korzystania z klawiatury, znaki ,./;+*-=<> oraz ?:_^, a także funkcje przesuwania kursora można wywoływać na dwa sposoby: albo przy użyciu odpowiednich kombinacji klawiszy ZX Spectrum, albo wciskając klawisz bądź kombinację klawiszy, którymi wywołuje się daną funkcję (lub dany znak) z klawiatury Atari.

Np. znak zapytania (?) znajduje się na klawiaturze ZX Spectrum pod klawiszem [C]: żeby go wywołać na ekran, trzeba wcisnąć kombinację klawiszy [Symbol Shift]+[C] - czyli, na klawiaturze Atari, odpowiednio [Control]+[C] lub [SELECT]+[C]. Ale tak poza tym można go również wywołać "metodą atarowską", tj. przez wciśnięcie klawiszy [Shift]+[?].

Ciekawostki

  • Program napisano na Atari, początkowo z kartą F7 (10,62 MHz), potem z rozszerzeniem SIMMius 4 MB (1,77 MHz), na końcu z kartą Rapidus (początkowo 16, potem 20 MHz). Wykorzystano MAE jako edytor, a kod źródłowy został zasemblowany (nieopublikowanym) asemblerem N16 autorstwa KMK. Cały proces kompilacji Let's Emu! wymaga też SpartaDOS X w wersji co najmniej 4.47.
  • Konwersja atrybutów koloru robiona jest blitterem VBXE, z tego względu w praktyce nie zajmuje czasu CPU.
  • Objętość kodu programu emulacji całego ZX Spectrum 48k wynosi tylko nieco ponad 34 KB.

Przykładowe gry

Grafika:Letsemu_3weeks1.png Grafika:Letsemu_3weeks2.png Grafika:Letsemu_boulder.png Grafika:Letsemu_crap.png Grafika:Letsemu_cyber1.png Grafika:Letsemu_elite.png Grafika:Letsemu_fairlight1.png Grafika:Letsemu_jsw.png Grafika:Letsemu_knightlore.png Grafika:Letsemu_paperboy.png Grafika:Letsemu_rick.png Grafika:Letsemu_trapdoor.png

Snapszoty zrzucono z emulatora Altirra.

Do ściągnięcia

Zobacz też

Odnośniki zewnętrzne

Personal tools