Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Emulator ZX Spectrum 48 na STM32F407

Samuraj 21 Mar 2019 21:53 6594 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.

    Cool! Ranking DIY
    Can you write similar article? Send message to me and you will get SD card 64GB.
    About Author
    Samuraj
    Level 35  
    Offline 
    Has specialization in: programowanie c++
    Samuraj wrote 2782 posts with rating 464, helped 282 times. Live in city Szczecin. Been with us since 2002 year.
  • Computer ControlsComputer Controls
  • #2
    tplewa
    Level 39  
    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
    Level 11  
    tplewa wrote:
    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.
  • Computer ControlsComputer Controls
  • #4
    tplewa
    Level 39  
    RafGan wrote:
    [
    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
    Level 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 of HydePark/Cars
    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
    Level 40  
    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
    Level 40  
    arturavs wrote:
    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
    Level 31  
    HD-VIDEO wrote:
    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
    Level 39  
    arturavs wrote:
    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ł :)
  • #12
    LChucki
    Level 31  
    tplewa wrote:
    Jak by Sinclair miał wtedy takie ARM-y to ZX Spectrum inaczej by wyglądał ;)

    DMA nie byłoby robione na rezystorach.
  • #13
    Janusz_kk
    Level 31  
    Bo to było proste i tanie rozwiązanie konfliktu na szynie danych :)