Hello guys,
Cześć chłopaki,
(jeśli pozwolisz mi przejść na angielski, daj mi znać. To jest tekst przetłumaczony przez Google...)
Więc możesz pytać, próbuję odpowiedzieć.
Bardzo się cieszę, że znalazłeś mój wózek i z niego korzystasz, ale po pierwsze, karta rev4 nie jest tak idealna, jak chciałem. Musisz zrozumieć, że chciałem, aby to rozszerzenie było tanim wózkiem, dzięki któremu mój ZX81 będzie użyteczny, dlatego na wózku znajduje się chip flash SPI (2-4-8-16MB). To było łatwe. Chciałem też grać w gry, więc zaimplementowałem Kempston Joy I/F. Ciekawostka: Znalazłem 3 gry, które współpracują z Kempston I/F, żadna z nich nie działała. Dwa z nich zostały naprawione przez autora gry, jednak nie pozwolił mi na włączenie jego gier do flasha (jeśli ktoś chce, niech pobierze...).
Z biegiem czasu zdałem sobie sprawę, że radzenie sobie z radością nie jest tak proste, jak na C64 czy w moim ukochanym TVC. Więc dla przyjemności zaimplementowałem obsługę kursora, ale wymagało to znacznie większego GAL (nawet bawiłem się z GAL26V12, ale strasznie mi się nie udało). Tak czy inaczej, pierwotnie właściwą GAL był 16v8...
Nigdy nie planowałem stosowania DIP GAL, ponieważ zajmowały one większą powierzchnię płytki drukowanej, chciałem, aby płytka była mała i schludna.
Tak, chciałem też mieć je fabrycznie przylutowane, więc aż do wersji 3 gniazda PLCC były SMD (nienawidziłem ich instalować). Zwykle zamawiam w JLC, ale oni nie mieli gniazd SMD PLCC.
Gdy radość wzrosła, przyszedł do mnie facet i zapytał, dlaczego nie zrobiłem czytnika kart SD, bo znacznie by to zwiększyło użyteczność... No cóż, użycie interfejsu SPI karty SD to nie problem, ale biblioteka obsługujący kartę nie było takie proste. Jest to biblioteka FatFs skompilowana przez kompilator z88dk (sprawdź napisy: w menu SD naciśnij „C”). Pamięć EEPROM 27C512 ma 4 banki po 16 tys. Pierwszy bank zawiera układ flash (i jego menu), trzeci i czwarty bank zawiera bibliotekę FatFs i jej menu... FatFs nie mieszczą się w 16kB (0000-3FFFF ZX).
W wózku znajduje się 32kB RAM. Wewnętrzna pamięć RAM jest stale wyłączona. 4000-7FFF to pierwszy blok 16kB zewnętrznej pamięci RAM. 8000-BFFF to drugi bank lub pamięć RAM (nie można stąd wykonać kodu). C000-FFFF jest zwierciadłem obszaru 4000-7FFF. Cały obszar pamięci RAM jest również włączony, gdy procesor Z80 jest w fazie /RFSH, a A14-A15 jest w dowolnym miejscu innym niż 00b (to sprawia, że wózek obsługuje WRX, jeśli się nie mylę).
Problem z wózkiem polega na tym, że ULA może czytać obrazy postaci tylko z wewnętrznej pamięci ROM. Zatem wózek wyłącza zewnętrzną pamięć ROM i włącza wewnętrzną pamięć ROM, gdy procesor jest w fazie /RFSH, wartość /MREQ jest niska, a wartości A14 i A15 wynoszą 00b. Problem leży w dokładnym określeniu czasu.
Niektóre ZX81 lubią mieć /MREQ w równaniu, inne nie (zwłaszcza przebudowana maszyna ZX81+38)...
A co gorsza, znaleźliśmy rzadki przypadek, gdy żaden z nich nie działał poprawnie. Maszyną, która nie działała, była płyta z wydania 1 z ULA 184 i wewnętrzną pamięcią ROM oznaczoną jako 649. Nie twierdzę, że to nigdy nie zadziała, ale u nas ten konkretny typ nie działał.
Kondensator na linii A15 może zniekształcić sygnał i przesunąć taktowanie. Dobrze byłoby mieć generowany sygnał o częstotliwości 6,5 MHz, jakiś licznik i start, aby włączyć wewnętrzną pamięć ROM na niskim poziomie /RFSH i /MREQ oraz zwolnić połowę zegara (6,5 MHz) później niż te sygnały. Ale nie można tego zrobić za pomocą chipa GAL.
Ktoś wspomniał powyżej o CPLD. Główną przyczyną, dla której nie korzystałem z CPLD, jest to, że ich nie znam. (i chciałem, żeby ta karta była prosta i tania...). Nie jest to najlepsza decyzja w moim życiu, ale jednak. To coś czyta karty SD – przez większość czasu!!
Aha, jeszcze jedno. Z karty SD nie będziesz mógł załadować programów o rozmiarze większym niż 16kB, ponieważ procedury obsługi SD znajdują się w 0000-7FFF w RAM. Program jest ładowany do 8000-BFFF i kopiowany z powrotem do 4000-7FFF przed jego wykonaniem.
--- original English ---
So you may ask, I try to answer.
I'm really glad that you find my cart and use it, but the first thing is that the rev4 card is not that perfect I wanted to be. You need to understand that I wanted that extension a cheap cart that makes my ZX81 usable, that is why the SPI (2-4-8-16MB) flash chip is on the cart. That was easy. I wanted to play games also, so I implemented the Kempston joy i/f. Funfact: I have found 3 games that work with Kempston I/F, none of them worked. Two of them was fixed by the author of the game, but he didn't allow me to include his games in the flash (if anyone wants it, download it...).
As time passed I realized that joy handling is not that straightforward as like on C64 or my beloved TVC. So I implemented the cursor handling for the joy, but it required a way larger GAL (I even played around with the GAL26V12, but I failed terribly). Anyway, originally the right GAL was a 16v8...
I never planned with DIP GALs, as they consumed larger pcb area, I wanted the pcb small and neat.
Yep, I also wanted to have them factory soldered, so up until rev3 the PLCC sockets were SMD (I hated putting them up). I usually order from JLC and they didn't have SMD plcc sockets..
After the joy was enhanced a guy came to me asking why I didn't do SD card reader, it would make it much more usable... Well, using the SPI interface of the SD card is not a bit deal, but the library that handles the card was not that easy. It is the FatFs library compiled by z88dk compiler (check the credits: in SD menu press 'C'). The 27C512 EEPROM has 4x 16k banks. 1st bank contains the flash IC (and its menu), the 3rd and 4th banks contains the FatFs lib and its menu... FatFs couldn't fit in 16kB (ZX's 0000-3FFFF).
There is 32kB RAM on the cart. The internal RAM is constantly disabled. 4000-7FFF is the first 16kB block of the external RAM. 8000-BFFF is the second bank or the RAM (code cannot be executed from here). C000-FFFF is the mirror of the 4000-7FFF area. The complete RAM area is also enabled when the Z80 CPU is the /RFSH phase and A14-A15 is anything but 00b (this makes the cart WRX capable if I'm not mistaken).
The problem of the cart lies in the fact that ULA can read the character images only from the internal ROM. So the cart turns off the external ROM and enables internal ROM when CPU is in /RFSH phase, /MREQ is low and A14 and A15 is 00b. The problem lies in the exact timing.
Some ZX81 likes to have /MREQ in the equation, some don't (especially the ZX81+38 rebuilt machine) ...
And to make things even worse we have found a rare case, when none of them works properly. The machine that didn't work was an Issue 1 board with ULA 184 and an internal ROM marked as 649. I don't say that this will never work, but for us that specific type didn't work..
A capacitor on the A15 line could distort the signal and shift the timing. It would be good to have a 6.5MHz signal generated and some counter and start enable the internal ROM on /RFSH and /MREQ low, and release one half clock (6.5MHz) later than these signals are released. But this cannot be done with the GAL chip.
Someone mentioned the CPLD above. The major cause I didn't use CPLD is because I don't know them. (and wanted to have this card simple and cheap...). Not the best decision in my life, but still. This thingie reads SD card - most of the time!!
Oh, one more thing. From SD card you will not be able to load more that 16kB programs, because SD handling routines are located in 0000-7FFF in RAM. The program is loaded into 8000-BFFF and copied back to 4000-7FFF before executing it..