Wpis z mikrobloga

A cóż to tak się świeci i mryga? ( ͡° ͜ʖ ͡°)

Już śpieszę z wyjaśnieniem. To 8-bitowy procesor 6502 używany między innymi w Atari, Commodorach i innych takich. Tutaj podpięty do EEPROMA (o którym zaraz) oraz interfejsu W65C22S który pozwala na łatwe wysyłanie i "przetrzymywanie" (latchami) tego co akurat znajduje się na busie łączącym procesor i wszystkie podzespoły ( ͡° ͜ʖ ͡°)

Teraz program ma prosty kod, każdy 0x** przedstawia jeden bajt - czyli jedną instrukcje na procesora. 0x to notacja w hexach, czyli np. 0xA9 z pierwszej linijki to po prostu A9 = 169 w systemie dziesiętnym lub 1010 1001 w systemie binarnym. Dla procesora 0 to napięcie na "masie", natomiast 1 to napięcie całego układu (w tym wypadku 5V).

Procesor jest zaprogramowany by móc odczytywać te instrukcje. I tak np. instrukcja A9 to "ładowanie" pewnej wartości do wewnętrznego rejestru (jakby komórki pamięci) procesora.

Instrukcje mają swój adres w pamięci, adres pamięci jest 16 bitowy, co pozwala nam na zaadresowanie (uwaga) 64KB danych. Sporo prawda? Niestety używamy tylko połowy z tego, gdyż tak duży mamy EEPROM (pamięć tylko do odczytu). Kod zaczyna więc pracę w połowie swoich jednostek adresowych a więc 0x8000 (wartość w połowie między 0x0000 a 0xFFFF). Gdy adresujemy coś "poniżej" wartości 0x8000 odwołujemy się do innych podzespołów komputera pomijając całkowicie EEPROM.

0xa9, 0xff, # lda $ff - ładujemy wartość FF (1111 1111) do rejestru
0x8d, 0x02, 0x60, # sta $6002 - wysyłamy z rejestru coś na adres 60 02 (0110 0000 0000 0010) - jest to adres do konfiguracji naszego interfejsu wejścia/wyjścia

# W tym wypadku zaprogramowaliśmy by na adresie 6002 móc wysłać wartość 1111 1111 - sprawia to, iż wszystkie piny naszego interfejsu są ustawione w tryb "wysyłania" wiadomości.

0xa9, 0x55, # lda $55 - ładujemy do rejestru wartość 55 (0101 0101)
0x8d, 0x00, 0x60, # sta $6000 - następnie wysyłamy ją do interfejsu by ten wysłał na ledy tą wartość

0xa9, 0xaa, # lda $aa - ładujemy do rejestru wartość AA (1010 1010)
0x8d, 0x00, 0x60, # sta $6000 - następnie wysyłamy ją do interfejsu by ten zmienił ledy i dzięki temu możemy oglądać ładną i prostą animacje ()

0x4c, 0x05, 0x80, #jmp $8005 - funkcja jump, która wraca nasz komputer na adres w pamięci 8005 czyli tuż przed naszym ładowaniem wartości 55 do rejestru - robimy to dlatego, iż nie musimy drugi raz konfigurować wyjścia interfejsu.

I voila - tak oto działa nasz prosty program. Za pomocą tego dokumentu możemy teraz sami zaprogramować dowolne instrukcje w naszym procesorze wykorzystując ich wartości podane w HEX.

O dziwo najcięższą rzeczą do zrobienia był dla mnie programator EEPROM który musiałem zrobić sam za pomocą Arduino (widać go po prawej gdzie wpięty jest Arduino Nano). Sam programmer jest napisany w Arduino, niestety ten ma tylko 2KB pamięci więc wgranie 32KB romu nie dałoby rady, na szczęście można go podłączyć i przesyłać z kompa za pomoca interfejsu serial. Tutaj wykorzystałem do tego Pythona.

Cała konstrukcja z Arduino Mega używana jest jedynie jako zegar dla komputera oraz do podglądu wartości jakie przechodzą przez procesor.

Na ekranie widać kolejno: wartość adresu wyrażona w zapisie binarnym - wartość będąca na 8 bitowym BUSie procesora w zapisie binarnym - zapis adresu w HEX - r lub W mówiące czy procesor odczytuje coś (np z eepromu) czy wysyła coś (np. do interfejsu) - wartość BUSa w HEX - ostatnie cyfry to prędkość procesora liczona w Hz (tu oscyluje w okolicach 21.37Hz, maks to jakieś.. 0.5MHz :( ).

Jak macie jakieś pytania to zapraszam ( ͡° ͜ʖ ͡°) Następny w kolejności - wyświetlacz i gra Snake :D

#elektronika #programowanie #arduino #retrocomputing #retrogaming
  • 9