Let's Emu!
From Atariki
Wersja z dnia 12:39, 5 lip 2015 KMK (Dyskusja | wkład) (→Zalecana konfiguracja sprzętowa) ← 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 (bez tego niektóre programy - np. gra Trap Door - są bezużyteczne). | + | 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). |
- | 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. | + | 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 (75 KB), a z twardego dysku na [[PBI]] to wszystko ładuje się w kilka sekund. | + | 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 41: | Linia 42: | ||
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> | ||
Linia 49: | Linia 57: | ||
</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> | ||
Linia 56: | Linia 68: | ||
</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 65: | 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 73: | Linia 103: | ||
== Klawiszologia == | == Klawiszologia == | ||
- | Program obsługiwany jest z menu widocznego na obrazku. Poza tym do dyspozycji są klawisze konsoli: | + | 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ń) | * 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 113: | 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
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
- procesor 65C816 taktowany co najmniej 7 MHz (optymalnie - 20 MHz)
- przynajmniej 512k pamięci liniowej (64+512, czyli razem 576k)
- karta Rapidus
- VBXE
- Evie, SONari lub stereo POKEY
- szybki twardy dysk
- SpartaDOS X
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
Snapszoty zrzucono z emulatora Altirra.
Do ściągnięcia
Zobacz też
Odnośniki zewnętrzne
- Film prezentujący działanie emulatora.
- "Let's Emu!" gra (na Pokeyu) utwór "Restless Fighter" (skomponowany przez Shiru na beeper). Dla porównania, oryginału można posłuchać tutaj.
- "Let's Emu!" gra (na Evie) utwór z inwitra na Wapniaka 2012 (skomponowany przez Yerzmyeya na PSG).