Czy można wyświetlić napis za pomocą jednego rozkazu procesora?

 


Mamy już działający komputer, więc najwyższy czas napisać dla niego jakiś program...

Hello World on CA80
Tradycyjne powitanie.


Najpierw należy zapoznać się ze sprzętem. Znowu! 😖Wszędzie to samo - "Przeczytaj dokumentację." Jednak warto to zrobić, bo przecież trudno się poruszać "po omacku". Na szczęście wystarczy nam MIK05 i MIK08. Nie musimy od razu całości "wykuć na blachę", ale zajrzeć do opisu wyświetlacza (MIK05 str. 5). 

MIK05

Segments of display CA80
Rozmieszczenie segmentów wyświetlacza.

Display buffer of CA80
Bufor wyświetlacza CA80.

To co widzimy na wyświetlaczu, to odwzorowanie ośmiu bajtów pamięci RAM. Czyli wystarczy włożyć tam odpowiednie wartości i załatwione. 👌Byłoby tak, gdyby nasz wyświetlacz tylko do tego służył, jednak monitor wykorzystuje go do swoich celów i ciągle coś tam zmienia. Wpisywanie zleceniem *D nic nam nie da. Ale czym jest "monitor"? Jest programem ułatwiającym, a nawet umożliwiającym użytkowanie komputera. Zawiera wiele cennych procedur (w różnych językach podprogramy inaczej są nazywane. Np. w C mówimy o funkcjach, a w Pascalu o procedurach) obsługujących urządzenia systemowe (klawiaturę, wyświetlacz, magnetofon - taki odpowiednik HAL-a) oraz prawdziwy debugger. Można za jego pomocą modyfikować zawartość RAM (np. wpisywać program), wykonywać program krokowo lub z pułapkami oraz sprawdzać i modyfikować zawartość rejestrów. Wyświetlmy więc "HELLO"!


Najpierw napiszmy algorytm. Można to zrobić za pomocą jakiegoś języka wyższego rzędu, np. C.


Wszystkie kursy od tego się zaczynają.


Teraz dostosujmy go do naszego sprzętu:

Hello World.
Nazwy zmiennych dobrałem tak, żeby od razu kojarzyły się z rejestrami procesora.

Dlaczego przepisujemy zawartość jednej tablicy do drugiej? Pierwsza jest danymi programu, a druga buforem wyświetlacza. Nasz napis będzie tam dopóki nie wyświetlimy czegoś innego.


Za pomocą monitora utwórzmy więc pierwszą tablicę. Warto zwrócić uwagę, że cyfry wyświetlacza rozmieszczone są odwrotnie, możemy więc od razu napisać " OLLEH  ", żeby było prościej. Spacje na początku i końcu "formatują" tekst. Wciskajmy kolejno:


[M][D][C100][0][=][3F][=][38][=][38][=][79][=][76][=][0][=][0][=][M]


Następnie wpiszmy do rejestrów  ich wartości początkowe:


[F][8][.][C1][=][9][.][0][=][B][.][0][=][C][.][8][=][D][.][FF][=][E][.][F7][=][M]


Pozostał jeszcze do napisania właściwy program. Ponieważ będzie on przepisywał jedną tablicę do drugiej, wystarczy nam jeden rozkaz: LDIR. 😎


[M][D][C000][ED][=][B0][=][M]


Co zrobiliśmy do tej pory? Utworzyliśmy tablicę " HELLO  " pod adresem 0C100H (0xc100), wpisaliśmy wartości do rejestrów:

HL = 0C100H ; adres początku tablicy (adres sami wybieramy ale HL już ma taką wartość)

DE = 0FFF7H ; adres początku bufora wyświetlacza (ustawiony przez pana Gardynika)

BC = 8 ; liczba znaków do przesłania

(Oczywiście nie piszemy do rejestrów, ale do RAM, gdzie są zapamiętane wartości rejestrów użytkownika. Monitor również jest programem i działa w tym samym procesorze, używając jego rejestrów.)

i wprowadziliśmy kod rozkazu LDIR (load, increment and repeat) pod adres 0C000H (zwyczajowo najczęściej używany, bo tam zawsze jest RAM).


Nie możemy tego "programu" po prostu włączyć, bo nie ma dalszego ciągu i procesor poszedłby "w maliny", więc użyjmy pułapki. Uruchommy program zleceniem *G - 


[G][C000][.][C002][=]


Naturalnie tak się nie pisze "prawdziwych" programów, ale chodziło mi o pokazanie jak zacząć. Powinniśmy zrobić wszystko po kolei:


ORG 0C000H ;ADRES POCZĄTKU PROGRAMU

LD HL,HELLO ;ADRES DANYCH DO PRZESŁANIA

LD DE,BWYS ;ADRES BUFORA WYŚWIETLACZA

LD BC,8 ;DŁUGOŚĆ DANYCH

LDIR ;KOPIUJ DANE

CALL CI ;CZEKAJ NA WCIŚNIĘCIE KLAWISZA

RST RESTA ;WRÓĆ DO MONITORA

HELLO: DB "HELLO" ;SKRÓT MYŚLOWY - W TEN SPOSÓB MIELIBYŚMY KODY ASCII


Program nadal nie jest długi:


[M][D][C000][21][=][0][=][C1][=][11][=][F7][=][FF][=][1][=][8][=][0][=][ED][=][B0][=][CD][=][C6][=][FF][=][F7][=][M]


Teraz możemy bezpiecznie go włączyć zleceniem *G


[G][C000][=]

Hello on CA80-mini
Przetestowane na różnych wersjach.


Komunikat będzie widoczny do wciśnięcia dowolnego klawisza.


Działanie wszystkich procesorów wygląda bardzo podobnie. Wszystkie pobierają rozkazy z pamięci i następnie je wykonują. Rozkazy mogą zmieniać, porównywać, dodawać itd. Różnice polegają przede wszystkim na sposobie umieszczania programu w pamięci. Oczywiście każdy procesor jest inny, ma inną liczbę rejestrów, może mieć inną długość słowa danych (4, 8, 16 lub więcej bitów) czy magistrali adresowej, jednak zasada działania jest podobna. Niestety dzisiaj młodzi ludzie zaczynają od np. STM32 i z pewnością mają trudniejsze zadanie, niż było to czterdzieści lat temu. Łatwiejszy za to jest dostęp do elektroniki. Przewaga CA80 polega na jego samowystarczalności. Wystarczy kawałek papieru i ołówek żeby zacząć programowanie. Oczywiście na początku potrzebna jest jeszcze ściąga z kodami rozkazów i adresami procedur systemowych. Polecam napisanie własnego programu - nigdy nie byliście bliżej metalu (bare metal - angielskie określenie "programowania na rejestrach"). 😉



Komentarze

Popularne posty z tego bloga

Uruchamiamy CA80 na RCbus.

Magnetofon CA80.