Gestapowcy zablokowali wszystkie wyjścia,
ale Stirlitz wyszedł wejściem!
(popularna anegdota)
Drogi Gościu, jeżeli postanowiłeś zająć się zagadnieniem mikrokontrolerów, to lepiej by było, gdybyś kupił któryś z dostępnych na rynku nowych modeli i poszukał dostępnej dokumentacji oraz przykładów zastosowania w internecie lub specjalistycznych czasopismach. Jeśli jednak w twoim posiadaniu znajduje się trochę "rupieci", które żal by było wyrzucić, to często można je jeszcze wykorzystać do innych celów.
W wielu niepotrzebnych już urządzeniach można znależć w pełni przydatne do zastosowania mikrokontrolery. Co prawda, wielu z nich nie sposób przeprogramować i konieczne staje się dołączanie dodatkowej pamięci ROM na zewnątrz układu, co pogarsza estetykę urządzenia, jednakże dostępność "niepotrzebnych" kości pamięci i narzędzi programujących czyni użycie takich mikrokontrolerów praktycznie darmowym.
Przywrócimy do życia mikrokontroler 8049. W tym celu zgodnie z typowym schematem na kartonowej płycie zmontujemy układ zawierający dodatkową pamięć ROM wraz z podstawką i rejestrem dla młodszych bitów adresu. Podłączamy układ do mikrokontrolera, wyjście EA izolujemy od masy i poprzez rezystor 2kΩ podłączamy do napięcia +5 V.
Tworzymy program (ja wykorzystałem w tym celu asembler SBASM) i zapisujemy go w pamięci ROM (lub emulatorze) przy pomocy programatora. Włączamy układ i obserwujemy wynik.
Oczywiście nie jest to najbardziej praktyczne z zastosowań, jednakże dalszy sposób wykorzystania takiego układu jest ograniczony w zasadzie jedynie wyobraźnią konstruktora.
Ileż sprawnych lub częściowo sprawnych komputerów z procesorami od 8086 po nowsze trafia na złom! Oczywiście, wątpliwe jest, aby zainteresowały nas one ze względu na swoje pierwotne przeznaczenie, natomiast zastosowanie ich w innym celu nieraz sprawia kłopoty ze względu na ich zewnętrzne gabaryty. Jednakże można wymontować z nich jedynie płytę główną z portem LPT i to wystarczy, aby z niej korzystać. Ponadto do zasilania układu często wystarczy tylko 5 V, co upraszcza poszukiwanie zasilacza. Program sterujący najłatwiej jest umieścić w ROM BIOS albo w wolnych obszarach pamięci, albo też nadpisując w całości oryginalną zawartość BIOS-u. Rzecz jasna, lepszym sposobem jest umieszczenie naszego programu w rozszerzonej pamięci ROM, ale jest to już temat na zupełnie inną opowieść.
Jako przykład weźmy płytę główną z procesorem 386. Nawet nie montując na niej dodatkowej pamięci ROM zainstalujemy tam port LPT, tymczasowo usuniemy rodzimy BIOS i w jego miejsce wstawimy emulator pamięci ROM z naszym programem.
Program napisany w FASMie;=========================================
rom_size = 800h
rom_start = 100000h - rom_size
rom_empty = 0FFh
;=========================================
use16
;-----------------------------------------
start:
mov dx,378h
mov al,0
next:
out dx,al
mov cx,07FFFh
delay:
loop delay
not al
jmp next
;-----------------------------------------
times rom_size - 16 - $ db rom_empty
;-----------------------------------------
boot:
jmp (rom_start shr 4):start
;-----------------------------------------
times rom_size - $ db rom_empty
;=========================================
Uruchamiamy
Aby móc posługiwać się płytami głównymi ze starych komputerów powinniśmy być wyposażeni w programy zapisane w pamięci ROM. Jednak metoda zaprezentowana wyżej nie jest zbyt wygodna, ponieważ po wymianie BIOS-u w całości musimy samodzielnie dokonywać inicjalizacji wszelkich urządzeń peryferyjnych, które na dodatek najczęściej nie posiadają dostępnej dokumentacji. Znacznie pewniejszą metodą jest wykorzystanie rozszerzenia ROM BIOS-u.
W celu przeprowadzenia eksperymentów skonstruowałem płytę główną w oparciu o dawną kartę sieciową ze złączem ISA. Płyta pomyślana została jako uniwersalna, obsługuje dowolne kości pamięci ROM od 2 KB do 64 KB. Związane jest to z rozmaitością posiadanych przeze mnie kości ROM; praktycznie każda z nich była już używana. Przestrzeń adresowa zaczyna się od 0D0000h. Myślę, że można by było ograniczyć się do karty sieciowej ze złączem dla pamięci ROM, jednakże te, z którymi miałem do czynienia były przewidziane tylko dla układów 2764. Można również dostosować kartę sieciową do konkretnego typu pamięci, co będzie i tak rzeczą prostszą, niż konstruowanie płyty uniwersalnej.
Aby stworzyć sobie możliwość pisania programów dla rozszerzonej pamięci ROM najpierw napisałem program użytkowy, który oblicza sumę kontrolną zawartości całej pamięci ROM, jak również przedstawia liczbę korygującą obliczoną sumę do wartości 0: jest to konieczne, ponieważ BIOS wykonuje tę operację przed uruchomieniem programu zawartego w ROM-ie, aby upewnić się, że pamięć ta nie uległa uszkodzeniu.
Następnie tworzymy prostą aplikację, wyprowadzającą na ekran łańcuch znaków i oczekującą na naciśnięcie dowolnego klawisza. Zapisujemy ją w pamięci ROM, kość montujemy na karcie, a kartę wstawiamy w wolne złącze płyty głównej. Oto rezultat tej operacji: