Napisałem translator (kompilator asm) dla procka MC146805E2. Oczywista, że bez dostępu do właściwej wiedzy operacja ta jest niewykonalna (daje się wygooglać właściwe manuale, choć wymaga to trochę zachodu).
Procek ten jest jedynym z rodziny mikrokontrolerów MC6805, który nadaje się do odzysku, gdyż jak wiadomo, jest on od dawna nieprodukowany. Rodzina ta obejmuje kilka układów, które mają różne literki na końcu. Wszystkie te układy mają wbudowaną pamięć ROM przeznaczoną na program, której nie da się przeprogramować (bo to ROM) oraz nie oferują interfejsu do obsługi pamięci zawierającej program. Wyjątek stanowi układ z oznaczeniem E2 na końcu, który z definicji nie zawiera pamięci ROM na program, natomiast udostępnia pełny interfejs do obsługi pamięci na zewnątrz. Układ MC146805E2 jest w architekturze von Neumanna, więc przestrzeń adresowa procka (całe 8kB) można sobie dowolnie podzielić (z wyjątkiem obszaru pokrytego przez wewnętrzną pamięć RAM). Możliwe jest zatem (kosztem przestrzeni programu) dodanie własnych peryferali lub dodatkowej pamięci RAM. Chłopaki z Motoroli zrobili to jak zrobili, bo przykładowo procki z rodziny C51 mające nawet wbudowaną pamięć stałą ROM, której nie da się modyfikować, można zmusić by z definicji sięgali do pamięci zewnętrznej (każdy odzyskowy procek C51 da się zmusić, by realizował inny program niż ma wbity na stałe, w motorolce tego zrobić się nie da).
Wewnętrzna budowa mikrokontrolera przedstawia się następująco:
Zawarty w procku blok pamięci RAM ma swoją strukturę, ale zanim, to wcześniej należy przedstawić tryby adresowania pamięci w omawianym procku (wynikają one w jakiejś części z cech dawcy genów → procka MC6800). W prockach motorolowych występuje adres typu direct (bezpośrednio podany w kodzie instrukcji) z tym, że MC6800 (jak i MC146805) oferuje ten adres w formie skróconej do młodszego bajtu adresu (adres typu direct strony zerowej). Istnieje możliwość użycia do adresowania rejestru indeksowego X, z tym, że MC146805 znacznie rozszerza możliwości adresowania: do zawartości rejestru indeksowego można dodać stały ofset. Coś takiego występuje w Z80 w parze z rejestrem IX lub IY, ale w Z80 ofset jest jednobajtowy traktowany jako liczba w kodzie U2 (może być dodatni lub ujemny). W motorolce ofset jest w kodzie bez znaku (przez co ma dwukrotnie większy zakres) oraz może być jednobajtowy lub dwubajtowy. Reasumując, adres w MC146805 może być:
- jednobajtowy direct (dotyczy strony zerowej: przestrzeń adresowa od 0 do FF hex),
- dwubajtowy direct (adres dowolnego miejsca w przestrzeni adresowej),
- indeksowy bez ofsetu (z racji, że rejestr X jest 8-bitowy adres dotyuczy strony zerowej),
- indeksowy z jednobajtowym ofsetem,
- indeksowy z dwubajtowym ofsetem,
- relatywny jednobajtowy (w instrukcjach skoku) traktowany jako liczba ze znakiem (można skoczyć do przodu lub do tyłu).
Pamięć EPROM (z programem) należy tak umieścić w przestrzeni adresowej, by jej koniec „stykał” z końcem przestrzeni adresowej, gdyż ostatnie bajty przestrzeni zajmują wektory przerwań i resetu (i muszą znaleźć się w obrębie pamięci). Są to:
- adres procedury obsługi przerwania od timer'a (lokacja 1FF8:1FF9 hex),
- adres procedury obsługi przerwania zewnętrznego (lokacja 1FFA:1FFB hex),
- adres procedury obsługi przerwania programowego (lokacja 1FFC:1FFD hex),
- adres procedury uruchomienia po reset (lokacja 1FFE:1FFF hex).
Wykonywanie programu może zostać chwilowo zawieszone z powodu reakcji na przerwanie. Obsługa przerwania zapisuje na stos komplet rejestrów (akumulator, rejestr indeksowy, rejestr wskaźników i licznik rozkazów PC), pobiera w zależności od rodzaju przerwania odpowiednią parę bajtów z obszaru wektorów przerwań wskazującą na adres obsługi przerwania i tam przechodzi.
Znaleziony manual: