Kurs Assemblera cz. 1

Miałeś chyba wystarczająco dużo czasu, by przynajmniej zacząć kompletować oprogramowanie i książki o którym pisałem w poprzednim odcinku. Jeśli dysponujesz już omawianym wyposażeniem możemy zabrać się za ćwiczenia praktyczne. Pierwszym celem, jaki sobie postawimy, będzie wyświetlenie na ekranie literki „A”. Za pomocą BASIC zrobić to można bardzo prosto – wystarczy napisać:

PRINT „A”
wcisnąć RETURN. „A” na pewno się pokaże.
No dobrze, ale jeśli chcemy mieć „A” w lewym górnym rogu?
Proszę bardzo:

PRINT CHR$ (147); „A”
Bardzo ładnie. Skrzaty mówią jednak, że w komputerze Commodore 64 można zrobić wszystko za pomocą jednej lub kilku instrukcji POKE. Wpisz więc:

POKE 1024,1
Tak naprawdę BASIC stanowi jedynie ogniwo pośrednie pomiędzy użytkownikiem i asemblerem. Komputer nie jest w stanie zrozumieć kierowanych do niego angielskich słów PRINT, POKE czy LIST bez odpowiedniego programu w asemblerze. Wynika z tego, że program na wyświetlenie literki „A” napisany w BASIC został, PRZED wykonaniem, przetłumaczony na język maszynowy. Czy więc nie byłoby prościej dać komputerowi rozkazy od razu w asemblerze? Otóż byłoby! Uruchom teraz jeden ze swoich programów (monitor, asembler). Jeśli masz monitor, to wpisz:


A 2710 LDA #$01
A 2712 STA $0400
A 2715 RTS

Teraz wpisz G 2710 i wciśnij RETURN. Jeśli dysponujesz programem TurboAssembler wpisz:


*=$2710
LDA #$01
STA $0400 RTS

Naciśnij teraz strzałkę w lewo, trójkę, a potem „S”.

Obie operacje powinny dać taki sam efekt: w lewym górnym rogu ekranu pojawi się literka „A”. Jeśli niezbyt podoba się nam „A”, możemy ją zastąpi dowolnym innym znakiem, wpisując zamiast LDA #$01, np. LDA #$02 (litera B), LDA #$03 (C) i tak dalej. Jeśli nie podoba Ci się miejsce w którym jest wyświetlany Twój znak spróbuj zmodyfikować wiersz zawierający instrukcję STA $0400.

Tu należy się Tobie słowo wyjaśnienia na temat struktury ekranu na którym pojawia się tekst. Zastanów się nad następującym zagadnieniem: włączysz komputer, wpisujesz jakiś tekst, powiedzmy „ZABAWA Z KOMPUTEREM”. O ile w domu nie wyłączą prądu tekst ten będzie na ekranie widoczny tak długo jak komputer będzie włączony, chociaż ekran telewizora czy monitora na pewno NIE JEST wyposażony w pamięć. Skąd więc komputer wie GDZIE i JAKI tekst na ekranie należy umieścić?

Rozwiązano to niezwykle prosto: dane przeznaczone do wyświetlenia na ekranie są najpierw zapisywane w specjalnym obszarze pamięci określanej zwykle mianem „pamięci ekranowej”. Stamtąd są one pobierane i po przetworzeniu wysyłane na ekran telewizora. Wniosek z tego jest prosty: tekst można wyświetlać tak długo jak długo jest on zawarty w pamięci ekranowej komputera. Podobnie jest z grafiką i kolorami, chociaż dla nich zarezerwowano inne obszary pamięci, mają one również różną wielkość (ok. 1 KB dla ekranu tekstowego lub 8 KB dla grafiki).

Obszar pamięci ekranowej (tzn. pamięci przeznaczonej do przechowywania TEKSTU) jest zlokalizowany w Commodore 64 od adresu 1024 do 2023 co w systemie szesnastkowym odpowiada adresom $0400 do $07e7. Zwróć uwagę, że adres $0400 wymieniony w drugim wierszu programu odpowiada dokładnie komórce o adresie 1024 będącej pierwszą komórką pamięci ekranu tekstowego. Zmiana adresu $0400 powinna więc spowodować wyświetlenie litery „A” w innym miejscu ekranu. Spróbujmy teraz przyjrzeć się uważnie naszemu programikowi.

LDA jest mnemonikiem czyli trzyliterowym skrótem (synonimem) rozkazu LoaD Accumulator (załaduj akumulator). Wymieniona za nim liczba (zwana argumentem) jest, w tym wypadku, wartością do wczytania do akumulatora.

STA jest mnemonikiem rozkazu STore Accumulator (zapisz zawartość akumulatora). Rozkaz ten powoduje zapisanie liczby wpisanej uprzednio do akumulatora w miejscu określonym liczbą wpisaną bezpośrednio po STA. W naszym programie będzie to komórka pamięci o adresie $0400 (1024 dziesiętnie).

Rozkaz RTS umożliwia powrót do BASIC zaraz po zakończeniu naszego programu. Jest to jeden z rozkazów nie wymagających podawania argumentów.

Jeśli zajrzysz do spisu rozkazów asemblera, zobaczysz:

LDA – LoaD Accumulator (załaduj akumulator)
STA – STore Accumulator (zapisz akumulator)
RTS – ReTurn from Subroutine (powróć z podprogramu)

Możemy z tego wywnioskować, że miejsce w pamięci, do którego kom ter wpisał liczbę $01 (1 dziesiętnie), nazywa się akumulatorem. Akumulator może przechowywać tylko jedną liczbę; jeśli wpiszesz doń nową liczbę, stara zawartość akumulatora zostanie bezpowrotnie skasowana. No dobrze. O rozkazach, których używamy, wiemy już nieco więcej. Wiemy też, czego się po nich spodziewać. Wpiszmy więc:


*=$2710
LDA #$01
STA $0400
LDA #$02
STA $0401
LDA #$03
STA $0402
RTS
Strzałka w lewo "3","a"

Teraz na ekranie powinien się pokazać ciąg liter: A, B. C. I to wszystko za pomocą dwóch, najprostszych rozkazów asemblera. Aby nabrać wprawy proponuję jeszcze trochę samemu poeksperymentować. Spróbuj na przykład wyświetlić zamiast liter „ABC” litery X, Y i Z w drugim wierszu na ekranie (w jednym wierszu mieści się 40 znaków).

Po jakichś trzech, czterech próbach wyświetlania liter, proponuję coś bardziej rozbudowanego: oprócz litery, zmienić jeszcze jej kolor. Wiemy już, że kolory są przechowywane, podobnie jak tekst, w określonym obszarze pamięci RAM komputera; pamięć tę nazywamy pamięcią koloru. Mieści się ona w obszarze od $d800 a $dbff (55296 – 56319 dziesiętnie).

Jak jednak obliczyć numer komórki, do której wstawimy kolor? To stosunkowo proste – od adresu komórki pamięci ekranowej, w której zawarta jest nasza litera (np. $0428) odejmij $0400 (zostanie $28), a potem dodaj $d800 w wyniku czego otrzymasz $d828. Wartość zapisana w tej komórce ($d828) decyduje o kolorze znaku zapisanego w pamięci ekranowej (komórka $0428). Jeśli masz problemy z przeliczaniem adresów w systemie szesnastkowym to podaję adresy w postaci dziesiętnej:


pamięć ekranowa

$0400 = 1024
+$0028 = 40
-------------
$0428 = 1064

pamięć koloru
$d800 = 55296
+$0028 = 40
--------------
$d828 = 55336

Jeżeli kod szesnastkowy nie chce Ci wejść żadną miarą do głowy może warto byłoby zaopatrzyć się w jakiś podręczny kalkulator mający możliwości przeliczania wartości w trzech systemach: dziesiętnym, szesnastkowym i binarnym. Teraz wpisz i spróbuj uruchomić ten oto program:


*=$2710
LDA #$01
STA $0428
LDA #$00
STA $D828
RTS
Strzałka w lewo "3", "a"

Mamy już czarną literę „A”! Może być też biała, czerwona – jaką tylko chcemy. Trzeba w tym celu zmienić wartość argumentu po rozkazie LDA w linii 2715.

Dziś poznaliśmy instrukcje:
LDA #xx – wstaw wartość xx do akumulatora
STA xxxx – zapisz akumulator do komórki o adresie xxxx
RTS – powróć z podprogramu.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *