Indeks | English version |
Część systemowego oprogramowania mikrokomputera Casio PB-1000 jest ukryta w wewnętrznej pamięci ROM mikroprocesora o rozmiarze 3072 słów. Jest ona dostępna wyłącznie jako pamięć programu, nie można odczytywać z niej danych (z wyjątkiem stałych zakodowanych w instrukcjach natychmiastowego trybu adresowania). Tablice stałych używane przez procedury z tej pamięci muszą być umieszczone w zewnętrznej przestrzeni adresowej (dotyczy to np. tablic CORDIC, stałych zmiennoprzecinkowych, kodów klawiatury, wzorów znaków alfanumerycznych...).
Z powodu tego ograniczenia nie można bezpośrednio odczytać zawartości pamięci. Udało się jednak tego dokonać za pomocą krokowego wykonywania kodu przez wywoływanie przerwania IRQ2 podczas każdej instrukcji.
W tym celu wyprowadziłem sygnały magistrali do złączki wstawionej w gniazdo uniwersalnego programatora TopMax sterowanego przez komputer PC. Ten zestaw pozwala mi na wykonywanie dowolnej pojedynczej instrukcji, odczytu i modyfikowania rejestrów i pamięci, rejestracji operacji na magistrali, odliczania taktów zegara. Na podstawie otrzymanych informacji można podjąć próbę identyfikacji instrukcji.
Archiwum pb1000r0.zip zawiera częściowo skomentowany listing pamięci ROM odtworzony za pomocą opisanej metody.
Niektóre instrukcje nie mogą być jednoznacznie zidentyfikowane, ponieważ istnieją różne instrukcje dające ten sam efekt. Przykłady:
sbbm $5,$5,8 xrm $5,$5,8
anc $2,$3 anc $3,$2
Czasem udaje się zidentyfikować nie tylko instrukcję, ale również rzeczywistą zawartość pamięci. Jest to możliwe przez próbę wykonania kodu drugiego słowa 2-słowowej instrukcji. Przykłady:
0144: 4201 2E00 ld $1,&H2E ;rzeczywista instrukcja 0145: 2E00 pps $0 ;uboczna instrukcja
0020: 37EE 00FF jp &HFFEE ;rzeczywista instrukcja 0021: 00FF 37C7 adc $31,$23,jr &HFFDB ;uboczna instrukcja 0022: 37C7 00FF jp &HFFC7 ;rzeczywista instrukcja 0023: 00FF D113 adc $31,$17,jr &H0037 ;uboczna instrukcja 0024: D113 0900 ldw $19,&H0009 ;rzeczywista instrukcja ... 010A: 4100 3000 sbc $0,&H30 ;rzeczywista instrukcja 010B: 3000 B503 jp z,&H0300 ;uboczna instrukcja 010C: B503 jr c,&H010F ;rzeczywista instrukcja ... 0162: 7716 0001 cal &H0116 ;rzeczywista instrukcja 0163: 0001 adc $1,$sx ;uboczna instrukcja
013A: 4281 2C0B ld $1,&H2C,jr &H0146 ;rzeczywista instrukcja 013B: 2C0B ldd $11,(ix+$sx) ;uboczna instrukcja ... 0178: 89E4 0284 sbw $4,$2,jr &H0175 ;rzeczywista instrukcja 0179: 0284 8864 ld $4,$sx,jr &H01DE ;uboczna instrukcja 017A: 8864 0200 adw $4,$2 ;rzeczywista instrukcja
0454: 379E 00FF jp &HFF9E ;rzeczywista instrukcja 0455: 00FF FFFF adc $31,$31,jr &H03D7 ;uboczna instrukcja 0456: FFFF trp ;nieużywana lokacja