Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Emulator ZX Spectrum 48 na STM32F407

Samuraj 21 Mar 2019 21:53 4878 12
  • Emulator ZX Spectrum 48 na STM32F407


    Emulator ZX Spectrum 48 na STM32F407 Emulator ZX Spectrum 48 na STM32F407

    Zapewne nic odkrywczego ale wolnej chwili udało się połączyć parę projektów i wyszło takie coś.

    Jeśli chodzi o hardware to STM32F407 pędzony na 168MHz. Wyświetlacz 3.2", klawiatura 4x4. Musiałem zastosować parę sztuczek aby uzyskać zadowalający efekt jeśli chodzi o grafikę. W planach miałem użycie DMA lecz okazało się iż muszę zwalniać gdyż uzyskałem za dużą prędkość. Jeśli chodzi o emulacje Z80 to zaciągnięta z neta. Dorobiłem obsługę pamięci, wyświetlacza, przerzucanie zawartości plików Z80 do pamięci.
    Jako nośnika danych użyłem kart pamięci.
    Jaki był cel projektu - hmm chyba aby zabić wolny czas i poznać bliżej peryferia 407.

    Jeśli chodzi o sztuczki to zauważyłem iż w większość podobnych konstrukcji lwią cześć kontrolerowi zajmuje wyświetlanie Mimo stosunkowo dużej moc obliczeniowej w zależności od wykonania należy przepchnąć dość dużą ilość danych czy to po SPI czy po FSCM co nie wpływa korzystnie na efekt końcowy.

    Cała dostępna pamięć komputera X Spectrum podzielona jest na bloki.
    0x0000 - 0x3FFF ROM.
    0x4000 - 0x57FF Pamięć ekranu
    0x5800 - 0x5AFF Pamięć kolorów
    0x5B00 - 0xFFFF RAM

    W Pamięć ekranu zajmuje 0x5800 - 0x4000 = 0x1800 = 6144 bajtów. Nie mamy tutaj tradycyjnego zapisu jaki stosuje się obecnie z zapisem poszczególnych kolorów lecz zapisaną tylko informację czy dany pixel przyjmuje kolor tła czy koloru. Dostępna rozdzielczość to 256*192 = 49152/8bitów = 6144 bajty.

    Drugi blok to informacja o kafelkach ekranu. Zapisane informacje dotyczą fragmentów ekranu o rozmiarze 8x8 pixeli. W jednym bajcie zapisane są informacje o kolorze tła (3 bity), kolorze pixela (3 bity), informacja czy kolory są rozjaśnione (1 bit) oraz o tym czy kafelek co sekundę ma zamieniać przemiennie kolor tła z kolorem pixelu. Widać to szczególnie gdy chcemy wyświetlić kursor.
    Rozdzielczość jak wcześniej pisałem to 49152pixele /8/8 = 762 bajty.

    Pisząc obsługę ekranu skorzystałem z kafelek i jeśli zmienimy jakąś wartość to ustawiam go w osobnej tablicy jako brudny do wyświetlenia. Bez względu na to czy zmieniałem zawartość pixeli czy zmieniałem kolor. Dzięki temu w zależności od stanu do wyświetlenia jest 20-50 małych kwadratów 8x8 a nie cała zawartość ekranu. Zyskujemy tym samym bardzo na szybkości.

    Pliki ładowane są z karty pamięci przy wykorzystaniu FatFs.
    Jeśli chodzi o format plików Z80 to posiłkowałem się tym opisem
    https://www.worldofspectrum.org/faq/reference/z80format.htm
    Przy implementacji wykorzystałem tylko wersje 1.45 nie wymagający dekompresji. Pierwsze parę bajtów to zawartość rejestrów a potem czysty RAW pamięci ram.
    Wykorzystałem też emulator na komputerze gdyż większość dostępnych gier i dem dostępnych jest w postaci plików TAP. Emulator użyłem jako konwertera plików, odpalam emulator z plikiem TAP i zapisuje pod formatem Z80 na karcie pamięci.

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    Samuraj
    Poziom 35  
    Offline 
    Specjalizuje się w: programowanie c++
    Samuraj napisał 2801 postów o ocenie 379, pomógł 282 razy. Mieszka w mieście Szczecin. Jest z nami od 2002 roku.
  • #2
    tplewa
    Poziom 38  
    W sumie projektów takich trochę jest - od znanego zapewne wielu osobom ZX Spectrum na STM32F429 Discovery czy ZX 48K https://github.com/abelykh0/stm32f407-z80emu, ewentualnie https://github.com/sdima1357/specci48 i https://github.com/sdima1357/specci128

    W sumie nie wiem jak to ocenić, jak był by udostępniony kod źródłowy, binarka lub choć dokładniejszy opis - na czym kolega bazował, co zmienił, jak i co rozwiązał (co to za sztuczki i dlaczego były konieczne) itd. - byłby plus, a tak, to kolejny filmik z ZX na STM32 na Youtube i opis, w sumie z którego niewiele wynika...
  • #3
    RafGan
    Poziom 10  
    tplewa napisał:
    W sumie projektów takich trochę jest od znanego zapewne wielu osobą ZX Spectrum na STM32F429 Discovery czy ZX 48K https://github.com/abelykh0/stm32f407-z80emu ewentualnie https://github.com/sdima1357/specci48 i https://github.com/sdima1357/specci128

    W sumie nie wiem jak to ocenić, jak był by udostępniony kod źródłowy, binarka lub choć dokładniejszy opis na czym kolega bazował, co zmienił, jak i co rozwiązał (co to za sztuczki i dlaczego były konieczne) itd. był by plus, tak to kolejny filmik z ZX na STM32 na Youtube i opis w sumie z którego nie wiele wynika...



    W sumie przecież autor napisał, iż to nic odkrywczego :lol:
    Zapakować w jakąś fajną, małą obudowę (oczywiście z opisem) i będzie ZXPortable.
  • #4
    tplewa
    Poziom 38  
    RafGan napisał:
    [
    W sumie przecież autor napisał, iż to nic odkrywczego :lol:


    To jedno, ale to nie wyklucza tego aby nie próbować autora zmotywować do napisania czegoś więcej...
  • #5
    Samuraj
    Poziom 35  
    Uzupełniłem opis na tyle ile się dało. Jeśli są jakieś szczegółowe pytanie to chętnie na nie odpowiem. Łatwiej jest mi odpowiadać na konkretne pytanie.
  • #6
    ArturAVS
    Moderator HydePark/Samochody
    Gdybyś zbudował i pokazał światu ten emulator w 1982 roku, firma sir Clive'a Sinclaira poszła by z torbami. :-)
    Z sentymentem patrzę na takie konstrukcje( swego 1-go ZX poskładałem w 88 roku).
    Ubrać w jakąś ładną i funkcjonalną obudowę i mamy ZX Portable.
  • #7
    khoam
    Poziom 35  
    Z dużym sentymentem patrzę na tego typu projekty - na ZX Spectrum zaczynałem swoją przygodę z programowaniem. Ale tak, jak Kolega @tplewa już napisał, brakuje trochę więcej szczegółów, a przede wszystkim kodu źródłowego ;)
    A żeby iść z duchem czasu, załączam zdjęcie pamiątkowego "zwoju" z kodem źródłowym jednego z moich pierwszych "programów" na ZX Spectrum :)

    Emulator ZX Spectrum 48 na STM32F407
    Emulator ZX Spectrum 48 na STM32F407
  • #8
    HD-VIDEO
    Poziom 40  
    arturavs napisał:
    Gdybyś zbudował i pokazał światu ten emulator w 1982 roku, firma sir Clive'a Sinclaira poszła by z torbami.


    Ale Sir zrobił to na 3,5MHz a tutaj trzeba aż 168MHz
  • #10
    LChucki
    Poziom 30  
    HD-VIDEO napisał:
    Ale Sir zrobił to na 3,5MHz a tutaj trzeba aż 168MHz

    Ale Z-80 wspomagała ULA, ponadto aby emulować na CPU inną rodzinę trzeba wykonać kilka, kilkanaście a nawet więcej rozkazów niż w pierwowzorze.
  • #11
    tplewa
    Poziom 38  
    arturavs napisał:
    Gdybyś zbudował i pokazał światu ten emulator w 1982 roku, firma sir Clive'a Sinclaira poszła by z torbami. :-)


    Jak by Sinclair miał wtedy takie ARM-y to ZX Spectrum inaczej by wyglądał ;)

    Fajnie że autor coś więcej opisał w temacie więc i plusik poszedł :) Ja swojego czasu odpaliłem kilka emulatorów na Discovery ale nie zagłębiałem się zbytnio w kod - ot bardziej na zasadzie sprawdzić jak działa, więc miło poczytać jak ktoś coś więcej dłubał :)
  • #13
    Janusz_kk
    Poziom 24  
    Bo to było proste i tanie rozwiązanie konfliktu na szynie danych :)