Spisu treści:

6502 Minimalny komputer (z Arduino MEGA) Część 3: 7 kroków
6502 Minimalny komputer (z Arduino MEGA) Część 3: 7 kroków

Wideo: 6502 Minimalny komputer (z Arduino MEGA) Część 3: 7 kroków

Wideo: 6502 Minimalny komputer (z Arduino MEGA) Część 3: 7 kroków
Wideo: I jeszcze jeden język...- Jarek Ratajski 2024, Grudzień
Anonim
6502 Minimalny komputer (z Arduino MEGA) część 3
6502 Minimalny komputer (z Arduino MEGA) część 3

Idąc dalej, dodałem teraz ośmiokątny zatrzask, 8 prostokątnych diod LED i układ rezystorów 220 Ohm do płyty głównej. Istnieje również zworka między wspólnym pinem tablicy a masą, dzięki czemu diody LED można wyłączyć. Bramka 74HC00 NAND została zastąpiona bramką 78LS08 AND, zmieniono również okablowanie do bramki. Bramka AND oznacza, że 6522 znajduje się teraz na poziomie 6000 USD zamiast E000 USD.

Istnieje również pin do podłączenia zewnętrznego zegara do sterowania 6502. Przy takim połączeniu nie ma potrzeby, aby MEGA dostarczał sygnał zegara. MEGA nadal monitoruje, co dzieje się z procesorem, tak jak poprzednio.

Użyłem 20-pinowego 74HC373 do zatrzasku, ponieważ miałem trochę. To było w porządku, gdy był na płytce prototypowej, ale 74HC573 jest kompatybilny z magistralą i zaoszczędziłby dużo okablowania. UCN5801A, który jest 22-pinowym układem scalonym, może być również uwzględniony w obwodzie, ale okablowanie będzie nieco inne.

Górna pojedyncza pomarańczowa dioda LED jest wskaźnikiem zasilania, a dolna lewa czerwona wskazuje, kiedy trwa zapis. Ta ostatnia będzie nieistotna, jeśli deska będzie działać z większą prędkością.

Zmodyfikowany obwód znajduje się powyżej (z 74HC573).

Krok 1: Programy demonstracyjne

Programy demonstracyjne
Programy demonstracyjne

Monitor 6502 zawiera dwa proste programy demonstracyjne, a ich zdeasemblowany kod znajduje się tutaj.

Ten program ładuje 1 do rejestru 6502 A i przechowuje go w zatrzasku. Następnie dodaje 1 do rejestru A i przechowuje go w zatrzasku. Potem wraca do 005 $ i proces powtarza się w nieskończoność.

* = 1000

1000 A9 01 LDA #01 $ 1002 8D 00 41 STA 4100 $ 1005 69 01 ADC # 01 $ 1007 8D 00 41 STA 4100 $ 100A 4C 05 10 JMP $1005 100D. END

Ten program najpierw ustawia DDR portu B 6522 na wyjście. Następnie przechowuje 55 USD (B01010101) w porcie oraz zatrzasku. Rejestr A następnie obraca się o 1 krok w prawo i teraz przechowuje $AA (B10101010). To jest ponownie przechowywane w porcie B i zatrzasku. Program wraca do $005 i trwa bez końca.

* = 1000

1000 A9 FF LDA #$FF 1002 8D 02 60 STA 6002 $ 1005 A9 55 LDA # 55 $ 1007 38 SEC 1008 8D 00 60 STA 6000 $ 100B 8D 00 41 STA 4100 $ 100E 6A ROR A 100F 8D 00 60 STA 6000 $ 1012 8D 00 41 STA 4100 $ 1015 4C 05 10 JMP $1005 1018. END

Bystre oczy wśród was mogą zauważyć, że kolorowe diody LED pokazują inny wzór niż zielone. Dzieje się tak, ponieważ wspólny przewód jest podłączony do 5 V na kolorowych, a wspólny na zielonych jest podłączony do masy.

Zmień ten wiersz kodu na program2 lub program3.

setDataPins(program3[przesunięcie]);

Assembler i Disassembler 6502 są użytecznymi narzędziami, które pomagają kodować programy.

Krok 2: Dodawanie pamięci EEPROM

Dodawanie pamięci EEPROM
Dodawanie pamięci EEPROM
Dodawanie pamięci EEPROM
Dodawanie pamięci EEPROM
Dodawanie pamięci EEPROM
Dodawanie pamięci EEPROM

W przypadku płyty EEPROM użyłem płyty z paskiem 950 x 650 mm i 19mm męskich pinów nagłówka, aby umożliwić płytce wyczyszczenie tego pod spodem. Ta płyta jest podłączona do płyty 6502 poniżej. EEPROM to ATMEL 28C256, który ma 28 pinów i zawiera 32k x 8 bitów pamięci. Jest to więcej niż wystarczające dla obecnie używanych małych programów.

Nie zrobiłem schematu obwodu dla tej płyty, ale jest dość prosty, jak łączy się z płytą 6502 poniżej. Te chipy EEPROM nie są przyjazne dla magistrali, więc muszą być podłączone do poszczególnych pinów, stąd całe „zielone i białe spaghetti”. Rozwiązałem problem mostkowania na wcześniejszej płycie, łącząc ze sobą linie danych na spodzie płyty.

14 pinów adresowych pamięci EEPROM łączy się z odpowiednimi pinami po lewej stronie (zielone przewody), a piny I/O z pinami danych po prawej (białe przewody). Pin 27 (WE) jest podłączony do pinu 28 (5v), pin 22 (OE) jest podłączony do masy, a pin 20 (CE) jest podłączony do bramki NAND. 2 wejścia bramki NAND są podłączone do A15 na płyta główna. Oznacza to, że gdy ten pin przechodzi w stan wysoki, bramka NAND podaje niski sygnał do pinu CE EEPROM, co powoduje jego aktywację. Przy takiej konfiguracji oznacza to, że pamięć EEPROM może być odczytywana tylko przez 6502.

Ponieważ EEPROM znajduje się w górnych 32k na mapie pamięci, oznacza to, że $FFFC i $FFFD mogą przechowywać adres początkowy dla 6502 po jego zresetowaniu. Z 6522 mającymi adresy między 6000 a 600 USD, a zatrzask wynosi 4100 USD, zatrzymuje wszelkie konflikty pamięci.

W ten sam sposób można również zapisać wektor NMI ($FFFA i $FFFB) oraz wektor BRK / IRQ ($FFFE i $FFFF).

Krok 3: Programowanie EEPROM

Programowanie EEPROM
Programowanie EEPROM
Programowanie EEPROM
Programowanie EEPROM

Aby zapisać program w EEPROM, potrzebny jest programator. Zrobiłem jeden z płytki, Arduino Pro Mini, kilku 74HC595 i gniazda ZIF. Pierwotnie programator został stworzony dla AT28C16, który ma mniej linii adresowych niż AT28C256, więc musiał zostać zmodyfikowany.

Schemat obwodu pokazuje, jak podłączyć obie te pamięci EEPROM. Ze zdjęcia nie wynika, że dwa chipy 595 są do góry nogami, a nie tak, jak pokazano na schemacie. Styki 1 do 7 595/1 są zgodne z A1 do A7 pamięci EEPROM, niezależnie od tego, która jest używana. Oszczędza to 7 przewodów łączących. Płytka wygląda teraz trochę ciasno, a to dlatego, że pierwotnie używałem 24-pinowego gniazda DIL, które zostało teraz zastąpione znacznie większym 28-pinowym gniazdem ZIF.

Dołączony jest program, który współpracuje z moją tablicą. Program będzie działał z dowolnymi Arduino i 595 w obwodzie, jak pokazano. Wybrałem 5v Pro Mini, ponieważ jest kompaktowy i wystarczająco tani, aby zostawić go w konfiguracji.

Krok 4: Programy EEPROM

Programy EEPROM
Programy EEPROM

W programatorze EEPROM są trzy proste programy. Aby z nich skorzystać, wystarczy odkomentować linię, której chcesz użyć.

// Odczyt z portu A 6522

//const byte data = {0xA9, 0x00, 0x8D, 0x03, 0x60, 0xAD, 0x01, 0x60, 0x4C, 0x05, 0x90, 0x00};

Program pokazuje zrzut pamięci po zakończeniu. Poniższa część programu daje pełną kontrolę nad tym, co chcesz zapisać lub wymazać, ustawia $FFFC i $FFFD, a następnie wyświetla zawartość danego zakresu. Po prostu odkomentuj lub zmień parametry zgodnie z wymaganiami. Adresy można również wprowadzać w formacie dziesiętnym.

// kasowanie EEPROM(422, 930, 0x41); // Użyj do kasowania całości lub części EEPROM - początek, koniec, bajt

Serial.println("Programowanie EEPROM"); kwota = program_numeric_data (0x1000); zapis EEPROM (0x7ffc, 0x00); // Ustaw $FFFC dla 6502 writeEEPROM(0x7ffd, 0x90); // Ustaw $FFFD dla 6502 //writeEEPROM(0x1000, 0xA9); // Zapisz 1 bajt danych Serial.println("gotowe"); Zarys ciągu = " Written " + (String) ilość + " bytes"; Serial.println(zarys); Serial.println("Odczyt EEPROM"); printContents (0x0000, 0x112f); // Ustaw zakres wyświetlania printContents(0x7ff0, 0x7fff); // odczytuje ostatnie 16 bajtów z EEPROM

Skrócone wyjście z programu znajduje się powyżej.

Krok 5: Uruchamianie 6502 z pamięci EEPROM

Uruchamianie 6502 z pamięci EEPROM
Uruchamianie 6502 z pamięci EEPROM
Uruchamianie 6502 z pamięci EEPROM
Uruchamianie 6502 z pamięci EEPROM
Uruchamianie 6502 z pamięci EEPROM
Uruchamianie 6502 z pamięci EEPROM

Zaprogramowaną pamięć EEPROM można teraz włożyć do swojej płyty, a ta świnka łączy się z główną płytą 6502, która świnka łączy się z MEGA. Powyższe zdjęcia w widoku z boku i z góry pokazują, jak to wszystko do siebie pasuje.

6502 może teraz odczytać wektor startowy z $FFFC i $FFFD (czyli 9000 $), a następnie przeskoczyć do programu, który jest tam zapisany. MEGA nadal dostarcza sygnał zegarowy, a jego program musi zostać zmieniony, aby dostarczać tylko sygnał zegarowy i monitorować 6502. Do tego celu służy zmodyfikowany program.

Bieżące zdjęcie pokazuje, że ten program jest uruchomiony.

9000 LDA #$00 A9 00

9002 STA 6003 $ 8D 03 60 9005 LDA #$FF A9 FF 9007 STA 6002 $ 8D 02 60 900A LDA 6001 $ AD 01 60 900D STA 6000 $ 8D 00 60 9010 EOR # $FF 49 FF 9012 STA $ 4100 8D 00 41 9015 JMP $900A 4C 0A 90

Przełączniki są podłączone do portu A, a program wyświetla odczytaną wartość na porcie B i 74HC373 (który jest obecnie zasłonięty). przełączniki są podłączone do masy, a diody LED są podłączone do 5v. EOR #$FF rozwiązuje problem zatrzasku i portu B wyświetlającego różne wzorce poprzez przerzucanie bitów przed zapisaniem do zatrzasku.

Krok 6: Zewnętrzny sygnał czasu

Zewnętrzny sygnał czasu
Zewnętrzny sygnał czasu

Jeśli sygnał zegarowy zostanie przyłożony do pinu na górze płyty, 6502 może teraz działać niezależnie od MEGA. Oczywiście potrzebuje też zasilania. Eksperymentowałem z różnymi zegarami, a nawet uruchomiłem 6502 z częstotliwością 1 MHz z oscylatorem kwarcowym. MEGA nie nadąża za większymi prędkościami, więc musi zostać usunięty.

Próbowałem również wyjścia z timera 555, ale to nie działa. Myślę, że może to być dlatego, że nie jest to fala prostokątna? Po podłączeniu do jednego z wyjść CD4017 napędzał 6502. Podłączyłem jeden z powyższych zestawów, aby spróbować uzyskać sygnał zegara.

Wciąż szukam różnych metod uzyskania sygnału zegarowego.

Krok 7: Wniosek

Pokazałem, jak zbudować skomplikowane obwody i uzyskać bardzo prosty „komputer” do pracy z minimalną ilością części. To prawda, że obecnie komputer nie może wiele zrobić lub prawdopodobnie zrobi to w przyszłości.

Na początku lat 80-tych, z moim VIC20, zastanawiałem się nad niesamowitą maszyną i nie miałem pierwszego pomysłu, jak zacząć składać jedną. Czasy się zmieniły, podobnie jak technologia, ale nadal miło jest wrócić do podstaw i być dumnym z czegoś, co zbudowałeś od zera.

Aby dalej rozwijać ten komputer, zamierzam umieścić 2k SRAM w cenie od 0000 do 2047 USD i dodać oscylator 1 MHz. Prawdopodobnie doda coś takiego jak CD4040 (12-Stage Binary Ripple Counter / Divider), abym mógł korzystać z różnych częstotliwości zegara.

Może nawet dodać wyświetlacz LCD, aby wyświetlać tekst, a nie tylko migające światła. Programator EEPROM będzie również musiał zostać zmodyfikowany, aby poradzić sobie z większymi programami potrzebnymi do uruchomienia wyświetlacza LCD.

Mimo że MEGA staje się niepotrzebne do uruchomienia 6502, nadal jest przydatny do debugowania kodu maszynowego. Jak każdy wie, kod maszynowy zawsze zawiera błędy!

Zalecana: