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