CA80 bootloader.

  Trudno to sobie wyobrazić, ale nie zawsze były dostępne narzędzia do wgrywania programu do komputera. Zwłaszcza w latach osiemdziesiątych ubiegłego stulecia za żelazną kurtyną czyli w krajach takich jak Polska.


CA80 miał interfejs magnetofonowy, ale najpierw trzeba było program nagrać na taśmie, czyli mieć go w komputerze. Ale w czym problem? Problemów było wiele. Po pierwsze CA80 często był jedynym komputerem w okolicy. Drukarka była luksusem. Nawet ksero to było wyzwanie. Literaturę kopiowano na starych kopiarkach w których naświetloną metalową "kliszę" bujało się w pojemniku z tonerem, a dopiero potem odbijało na papierze. Po drugie - wynikające z pierwszego, programy pisało się ołówkiem na papierze, następnie tłumaczyło się mnemoniki na kody rozkazów, a na koniec obliczało się wartości skoków względnych. Po pewnym czasie ściąga stawała się niepotrzebna, a wartości skoków względnych wpisywało się bez zastanowienia. Człowiek też potrafi liczyć szesnastkowo! 

Bootloader dla CA80 na RC2014
Kolejne wcielenie tajemniczej płytki "CA80 bez ROM".

Kiedy już napisaliśmy program, trzeba było go ręcznie wpisać do pamięci CA80. A nie lepiej od razu do EPROMU? Jedyny programator, jaki był w okolicy, to MIK86... Poza tym najpierw trzeba uruchomić czyli "zdebugować", poprawić ewentualne błędy. Program napisany bezbłędnie wcale nie musi działać prawidłowo. Przecież można przyjąć złe założenia, albo przeoczyć jakiś ważny szczegół.


Na taśmie można było zapisywać jeszcze nieuruchomiony program. W razie jakiejś katastrofy w postaci zaniku zasilania, albo samoskasowania się źle napisanego kodu, możliwe było szybkie (trochę szybsze od ręcznego) odtworzenie ostatnio zapamiętanego stanu programu. Uff!!!


Koniec przydługiego wstępu. Dzisiaj wszyscy mamy komputery - nieraz kilka. Poza tym jest Internet, więc możliwa jest wymiana informacji między hobbystami z całego świata. Poznajemy konstrukcje, które zdobywają popularność, dzięki ich niekonwencjonalnym połączeniom nowych i starych technologii (AVR-y zaczynają być retro). Zainteresowanie Z80 rośnie dzięki udostępnieniu CP/M. Dzisiaj to i tak bardzo kulawe narzędzia, jednak pasjonaci nie zważają na niewygody.


CA80 w wersji SMD.
Pierwsza wersja CA80 mini.


Początkowo chciałem zminiaturyzować CA80. Zastosowałem układy SMD i zaprojektowałem od nowa płytki. Chciałem zastąpić Z80 jego większym bratem - Z180. Nawet zrobiłem prototyp, który działa. Zmodyfikowałem Z80-MBC2 tak, żeby współpracował z CA80. Najpierw zrobiłem programator EEPROM-ów.

 

Z80-MBC2 jako programator EEPROM.
Programator EEPROM na płytce Z80-MBC2.

        Już wtedy okazało się, że kod pochodzący ze wspomnianej konstrukcji jest niedoskonały. Na szczęście dla mnie napisano go w Arduino, do tego w prosty, przejrzysty sposób. Szybko udoskonaliłem niektóre fragmenty programu, żeby przyspieszyć jego pracę. Czas był ważny, bo EEPROM ma programowe zabezpieczenie przed zapisem. Jeżeli go nie włączymy, możemy nadpisać jego zawartość, co zdarza się w CA80. Niestety w czasie rozruchu czasem program "idzie w maliny". Prawdopodobnie jest to spowodowane prostym układem RESET składającym się z rezystora i kondensatora. Od ich wartości zależy czas narastania sygnału. Jeżeli trwa zbyt długo, z dzielnika NMI zostanie zgłoszone przerwanie niemaskowalne, a co za tym idzie adres powrotu zostanie zapisany na stosie. Wszystko w porządku, prawda? Otóż nie! Przerwanie zostaje obsłużone po zakończeniu wykonania rozkazu, nie wcześniej. Niestety rejestr SP (wskaźnik stosu) jest ustawiany w dalszej części programu, więc jest duże ryzyko, ze przerwanie wystąpi wcześniej. W konsekwencji niektóre próby włączenia CA80 kończyły się zapisaniem EEPROMU śmieciami. Kiedy poradziłem sobie z tym problemem, pojawił się następny. Z180 nie jest całkowicie zgodny z Z80. Różnice występują w różnych aspektach, są dodatkowe rozkazy, nie są wykonywane rozkazy nieoficjalne, sygnał CLK jest dzielony przez dwa i w rzeczywistości procesor pracuje wolniej (przy takim samym CLK) itd. Nie można użyć kodu z Z80-MBC2 do sterowania Z180. Okazało się, że jest jeszcze jedna różnica - niektóre cykle maszynowe mają inną liczbę taktów - zamiast czterech trzy. Ale po przeliczeniu wszystkiego od nowa, program nadal nie działał. Doczytałem gdzieś, że procesor musi mieć stabilny sygnał zegarowy i takie "szarpanie" z jakim mamy do czynienia w metodzie zastosowanej przez J4F (autor Z80-MBC2) mu nie służy. Rozwiązanie znalazłem w MIK5 i MIK9 w rozdziałach dotyczących uruchamiania świeżo zmontowanego CA80. Pan Gardynik radzi w beznadziejnych przypadkach zastosować MIK7 (brakujące ogniwo w serii podręczników MIK). Autor nazwał tak układ sprzętowej pracy krokowej, wykorzystującej sygnał WAIT_ . Podobne rozwiązanie jest w Z80-MBC2, ale do ustawiania WAIT_ służy IORQ_ (żądanie dostępu do układów wejścia wyjścia). Jest to użyte do komunikacji Z80 -> ATmega. Nie wykorzystywałem tego rozwiązania, bo skupiłem się na przesyłaniu danych w czasie rozruchu, a później AVR generował tylko CLK i NMI. (Czasem dokładałem mu też obsługę dotykowej klawiatury albo terminala jako wirtualnej klawiatury i ekranu jako wyświetlacza siedmiosegmentowego, ale o tym innym razem). No i wpadłem na pomysł, żeby WAIT_ ustawiać RD_. W czasie rozruchu ATmega udaje EPROM i podaje na szynę danych kody rozkazów i ich parametry. Zapisem do RAM zajmuje się Z80. Nie musimy wiedzieć, co robi procesor (nie analizujemy M1_). Po prostu wykonujemy kolejne kroki schematu. Kiedy procesor potrzebuje dane, ATmega reaguje na sygnał WAIT_. Po przesłaniu wszystkich danych wyłączamy tę funkcję i Z80 przejmuje inicjatywę. Przy okazji dodałem możliwość "zaczepki" ze strony CA80, jednak nie sygnałem IORQ_, co zablokowałoby dostęp do portów, ale EME8_ czyli "strobem" emulatora.



CA80 bootloader.
Mimo starań nie dopatrzyłem kilku szczegółów.

 

RC2014 doczekał się nowego gościa.
Złącza modułów SD i RTC.

 

Opracowanie płytki zajęło mi jeden dzień, schemat już miałem. Zamieniłem tylko ZS na RC2014 i wróciłem do THT. Ciasnota daje się we znaki. Scalaki urosły a areał o połowę mniejszy. Zmniejszyłem rozmiary rezystorów, ale i tak było ciasno. Moduły SD i RTC nie chciały się zmieścić, więc przeniosłem je pod płytkę. Rezystory podciągające magistral I2C i SPI też wcisnąłem pod AVR-a. Może nikt nie zauważy...

    P.S.    Na razie nie udostępniam "Gerberów". Po przetestowaniu naniosę poprawki. 


 

Komentarze

Popularne posty z tego bloga

Uruchamiamy CA80 na RCbus.

Magnetofon CA80.