![]() |
Wyjście Spis treści Poprzedni Następny
Tłumaczył z angielskiego: mgr Jerzy Wałaszek, wersja 1.0 |
©2012 mgr Jerzy Wałaszek
|
USR z argumentem liczbowym
Ten rozdział został napisany dla tych, którzy rozumieją kod maszynowy mikroprocesora Z80, czyli zbiór instrukcji używanych przez ten układ scalony. Jeśli nie znasz tego, a chciałbyś poznać, to wokoło znajdziesz mnóstwo książek na ten temat. Musisz zdobyć jakąś, której tytuł brzmi jakoś tak "Kod maszynowy z80 (lub język maszynowy) dla zupełnie zielonych", a jeśli będzie w niej wspomniany Spectrum, to tym lepiej.
Programy maszynowe są zwykle zapisywane w języku asemblera i chociaż wyglądają jak szyfr, nie są zbytnio trudne do zrozumienia przy odrobinie praktyki. (Instrukcje języka asemblera możesz zobaczyć w Dodatku A.) Jednakże do ich uruchomienia na komputerze będziesz musiał taki program zakodować na ciąg bajtów, a w tej postaci są one nazywane kodem maszynowym. To kodowanie jest zwykle dokonywane przez sam komputer przy pomocy programu o nazwie asembler. Spectrum nie posiada wbudowanego żadnego asemblera, lecz możesz taki kupić sobie na kasecie. Jeśli ci się to nie uda, to możesz też ręcznie dokonać takiego kodowania, o ile program nie jest zbyt długi.
Weźmy przykładowy program
ld bc, 99
ret
który ładuje parę rejestrów bc liczbą 99. Tłumaczy się to na cztery bajty kodu maszynowego 1, 99, 0 (dla ld bc,99) i 201 (dla ret). (Jeśli w Dodatku A wyszukasz 1 i 201, to znajdziesz ld bc, NN — gdzie NN oznacza dowolną liczbę dwubajtową — i ret.)
Gdy masz swój program maszynowy, następnym krokiem jest umieszczenie go w komputerze. (Asembler prawdopodobnie zrobiłby to automatycznie.) Musisz zdecydować, gdzie umieścić go w pamięci, a najlepiej jest zrobić dodatkowe miejsce pomiędzy obszarem BASIC a grafikami definiowanymi przez użytkownika.
Przykładowo załóżmy, że masz ZX Spectrum 16K. Na początku szczyt pamięci RAM wygląda następująco:
Jeśli wpiszesz
CLEAR 32499
dostaniesz 100 bajtów (aby nie brakło) od adresu 32500.
Aby wstawić ten program w kodzie maszynowym, możesz uruchomić taki program:
10 LET a=32500
20 READ n: POKE a,n
30 LET a=a+1:GOTO20
40 DATA 1,99,0,201
(Zatrzyma się on z komunikatem E Out of DATA [E Koniec danych], gdy wypełni te cztery podane przez ciebie bajty.)
Aby uruchomić ten kod maszynowy, użyjesz funkcji USR, lecz tym razem z argumentem liczbowym będącym adresem początku kodu maszynowego w pamięci. Wynikiem tej funkcji zawsze jest zawartość pary rejestrów bc przy powrocie z programu w kodzie maszynowym, zatem jeśli wpiszesz:
PRINT USR 32500
to otrzymasz odpowiedź 99.
Adres powrotny do systemu BASIC jest umieszczany na stosie procesora Z80 w normalny sposób, zatem powracasz przy pomocy instrukcji ret. W swoich programach nie powinieneś korzystać z rejestrów iy oraz i. Swój program w kodzie maszynowym możesz bardzo łatwo zapisać na taśmie przy pomocy polecenia:
SAVE "jakaś nazwa" CODE 32500,4
Niestety, nie ma sposobu takiego zapisu, aby po załadowaniu program sam się uruchomił, lecz możesz to obejść przy pomocy programu w języku BASIC:
10 LOAD "" CODE
32500,4
20 PRINT USR 32500
Wykonaj najpierw
SAVE "jakaś nazwa" LINE
a następnie
SAVE "xxxx" CODE
32500,4
LOAD "jakaś nazwa"
To załaduje i automatycznie uruchomi program w języku BASIC, a ten z kolei załaduje i uruchomi program w kodzie maszynowym.
![]() | I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe