İçindekiler:

6502 Minimal Bilgisayar (Arduino MEGA ile) Bölüm 3: 7 Adım
6502 Minimal Bilgisayar (Arduino MEGA ile) Bölüm 3: 7 Adım

Video: 6502 Minimal Bilgisayar (Arduino MEGA ile) Bölüm 3: 7 Adım

Video: 6502 Minimal Bilgisayar (Arduino MEGA ile) Bölüm 3: 7 Adım
Video: Street Fighter 2'de C64'te Neler Yanlış Gidiyor | Nostalji Nerd 2024, Temmuz
Anonim
6502 Minimal Bilgisayar (Arduino MEGA ile) Bölüm 3
6502 Minimal Bilgisayar (Arduino MEGA ile) Bölüm 3

Daha da ileri giderek, ana karta bir Octal Latch, 8 dikdörtgen LED ve 220 Ohm direnç dizisi ekledim. Ayrıca LED'lerin kapatılabilmesi için dizinin ortak pimi ile topraklaması arasında bir jumper vardır. 74HC00 NAND geçidi bir 78LS08 AND geçidi ile değiştirildi, kapıya giden kablolar da değiştirildi. AND kapısı, 6522'nin artık E000 $ yerine 6000 $'da bulunduğu anlamına gelir.

6502'yi çalıştırmak için harici bir saat bağlantısı için bir pin de vardır. Bu bağlantı ile MEGA'nın bir saat sinyali sağlamasına gerek yoktur. MEGA, daha önce olduğu gibi işlemcide neler olup bittiğini hala izler.

Mandal için 20 pin 74HC373 kullandım çünkü biraz vardı. Bu, devre tahtası üzerindeyken sorun değildi, ancak bir 74HC573 veri yolu uyumludur ve bir sürü kablo tasarrufu sağlardı. 22 pinli bir IC olan UCN5801A da devrede düşünülebilir, ancak kablolama biraz farklı olacaktır.

Üstteki tek turuncu LED bir güç göstergesidir ve sol alttaki kırmızı LED, bir yazma işleminin ne zaman gerçekleştiğini gösterir. Kart daha yüksek hızlarda çalıştırılırsa ikincisi önemsiz olacaktır.

Değiştirilen devre yukarıdadır (74HC573 ile).

Adım 1: Gösteri Programları

Gösteri Programları
Gösteri Programları

6502 monitöre iki basit tanıtım programı dahildir ve bunların demonte edilmiş kodu buradadır.

Bu program 6502 A kaydına 1 yükler ve bunu mandalda saklar. Daha sonra A kaydına 1 ekler ve bunu mandalda saklar. Sonra tekrar 1005 dolara sıçrar ve süreç sonsuza kadar tekrar eder.

* = 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

Bu program ilk olarak 6522 bağlantı noktası B'nin DDR'sini çıkışa ayarlar. Ardından, mandalın yanı sıra bağlantı noktasında 55 ABD doları (B01101011) depolar. A kaydı daha sonra 1 adım sağa döner ve şimdi $AA tutar (B10101010). Bu yine B bağlantı noktasında ve mandalda saklanır. Program 1005 dolara geri dönüyor ve sonsuza kadar devam ediyor.

* = 1000

1000 A9 FF LDA #$FF 1002 8D 02 60 STA 6002$ 1005 A9 55 LDA #55$ 1007 38 SAN 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

Aranızdaki keskin gözlüler, renkli LED'lerin yeşil olanlardan farklı bir desen gösterdiğini fark edebilir. Bunun nedeni, renkli olanlarda ortak ucun 5v'ye, yeşil olanlarda ortak olanın toprağa bağlı olmasıdır.

Bu kod satırını program2 veya program3 olarak değiştirin.

setDataPins(program3[ofset]);

6502 Assembler ve Disassembler, programlarınızı kodlamanıza yardımcı olacak kullanışlı araçlardır.

Adım 2: Bir EEPROM Ekleme

EEPROM ekleme
EEPROM ekleme
EEPROM ekleme
EEPROM ekleme
EEPROM ekleme
EEPROM ekleme

EEPROM kartı için 950 x 650 mm'lik bir şerit tahta ve 19 mm'lik erkek başlık pimleri kullanarak kartın alttakini temizlemesini sağladım. Bu kart, aşağıdaki 6502 kartına takılır. EEPROM, 28 pinli ve 32k x 8 bit bellek içeren bir ATMEL 28C256'dır. Bu, şu anda kullanılan küçük programlar için fazlasıyla yeterli.

Bu kart için bir devre şeması yapmadım, ancak aşağıdaki 6502 kartına nasıl bağlandığı oldukça basit. Bu EEPROM yongaları veri yolu dostu değildir, bu nedenle tek tek pimlere, dolayısıyla tüm "yeşil ve beyaz spagetti"lere bağlanmaları gerekir. Veri hatlarını kartın alt tarafında birbirine bağlayarak önceki karttaki köprüleme sorununu çözdüm.

EEPROM'un 14 adres pini sol taraftaki uygun pinlere (yeşil teller) ve I/O pinleri sağdaki veri pinlerine (beyaz teller) bağlanır. Pin 27 (WE) pim 28'e (5v), pim 22 (OE) toprağa ve pim 20 (CE) bir NAND geçidine bağlanır. NAND geçidinin 2 girişi A15'e bağlanır. ana tahta. Bu, bu pin yükseldiğinde, NAND geçidinin EEPROM'un CE pinine onu aktif hale getiren düşük bir sinyal verdiği anlamına gelir. Bu kurulumla, EEPROM'un yalnızca 6502 tarafından okunabileceği anlamına gelir.

EEPROM bellek haritasında ilk 32k'de yer aldığından, bu, sıfırlandıktan sonra $FFFC ve $FFFD'nin 6502 için başlangıç adresini tutabileceği anlamına gelir. 6522'nin adresleri 6000$ ile 600F$ arasında olduğu ve mandalın 4100$ olduğu için, herhangi bir bellek çakışmasını durdurur.

NMI vektörü ($FFFA ve $FFFB) ve BRK / IRQ vektörü ($FFFE ve $FFFF) de aynı şekilde yazılabilir.

Adım 3: EEPROM'u Programlama

EEPROM'un Programlanması
EEPROM'un Programlanması
EEPROM'un Programlanması
EEPROM'un Programlanması

Bir programı EEPROM'da saklamak için bir programlayıcıya ihtiyacı vardır. Bir şerit tahtasından, bir Arduino Pro Mini'den, birkaç 74HC595'ten ve bir ZIF soketinden yaptım. Başlangıçta, programlayıcı AT28C256'dan daha az adres satırına sahip olan bir AT28C16 için yapıldı, bu yüzden değiştirilmesi gerekiyordu.

Devre şeması, bu EEPROM'ların her ikisinin de nasıl bağlanacağını gösterir. İki 595 yonganın baş aşağı olduğu ve şemada gösterildiği gibi olmadığı fotoğraftan belli değil. 595/1'in 1 ila 7 numaralı pinleri, hangisinin kullanıldığına bakılmaksızın EEPROM'un A1 ila A7'si ile aynı hizadadır. Bu, 7 bağlantı kablosundan tasarruf sağlar. Kart şimdi biraz dar görünüyor ve bunun nedeni, orijinal olarak, şimdi çok daha büyük 28 pinli ZIF soketi ile değiştirilen 24 pinli bir DIL soketi kullanmamdı.

Panomla çalışan bir program dahildir. Program herhangi bir Arduino ve 595s ile gösterildiği gibi bir devrede çalışacaktır. 5v Pro Mini'yi seçtim çünkü kompakt ve kurulumda bırakılabilecek kadar ucuz.

Adım 4: EEPROM Programları

EEPROM Programları
EEPROM Programları

EEPROM programlayıcıda üç basit program vardır. Bunları kullanmak için kullanmak istediğiniz satırın yorumunu kaldırmanız yeterlidir.

// 6522 A bağlantı noktasından oku

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

Program bittiğinde bir bellek dökümü gösterir. Aşağıdaki programın parçası, yazmak veya silmek istediğiniz şeyin tam kontrolünü size verir, $FFFC & $FFFD'yi ayarlar ve ardından belirli bir aralığın içeriğini görüntüler. Sadece parametreleri istediğiniz gibi kaldırın veya değiştirin. Adresler ondalık biçimde de girilebilir.

// silEEPROM(422, 930, 0x41); // EEPROM'un tamamını veya bir kısmını silmek için kullanın - başlangıç, bitiş, bayt

Serial.println("EEPROM Programlama"); miktar = program_numeric_data(0x1000); writeEEPROM(0x7ffc, 0x00); // 6502 writeEEPROM(0x7ffd, 0x90) için $FFFC ayarlayın; // 6502 için $FFFD ayarla //writeEEPROM(0x1000, 0xA9); // 1 bayt veri yaz Serial.println(" done"); Dize anahat = " Yazılan " + (Dize) miktarı + " bayt"; Serial.println(anahat); Serial.println("EEPROM Okuma"); printContents(0x0000, 0x112f); // printContents(0x7ff0, 0x7fff) görüntülemek için aralığı ayarlayın; // EEPROM'da son 16 baytı okur

Programın kısaltılmış bir çıktısı yukarıdadır.

Adım 5: 6502'yi EEPROM'dan Çalıştırma

6502'yi EEPROM'dan Çalıştırma
6502'yi EEPROM'dan Çalıştırma
6502'yi EEPROM'dan Çalıştırma
6502'yi EEPROM'dan Çalıştırma
6502'yi EEPROM'dan Çalıştırma
6502'yi EEPROM'dan Çalıştırma

Programlanmış EEPROM artık kartına takılabilir ve bu domuzcuk MEGA'ya dayanan ana 6502 kartına geri döner. Yukarıdaki yan ve üstten görünüm fotoğrafları, hepsinin nasıl bir araya geldiğini gösteriyor.

6502 şimdi $FFFC ve $FFFD'den (9000$ olan) başlangıç vektörünü okuyabilir ve ardından orada depolanan programa atlayabilir. MEGA hala saat sinyalini sağlamaktadır ve programının sadece saat sinyalini sağlamak ve 6502'yi izlemek için değiştirilmesi gerekmektedir. Bunu yapmak için değiştirilmiş bir program sağlanmıştır.

Çalışan fotoğraf, bu programın çalıştığını gösterir.

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

Anahtarlar A bağlantı noktasına takılıdır ve program, B bağlantı noktasında ve 74HC373'te (şu anda gizlenmiştir) okuduğu değeri görüntüler. anahtarlar toprağa bağlı ve LED'ler 5v'ye bağlı. EOR #$FF, mandala yazmadan önce bitleri çevirerek mandal ve B bağlantı noktasının farklı desenler göstermesi sorununu düzeltir.

Adım 6: Harici Zaman Sinyali

Harici Zaman Sinyali
Harici Zaman Sinyali

Kartın üstündeki pime bir saat sinyali uygulanırsa, 6502 artık MEGA'dan bağımsız olarak çalışabilir. Elbette bir güç kaynağına da ihtiyacı var. Farklı saatler denedim ve hatta 6502'yi kristal osilatörle 1MHz'de çalıştırdım. MEGA daha yüksek hızlara ayak uyduramaz, bu nedenle kaldırılması gerekiyor.

Ayrıca bir 555 zamanlayıcının çıktısını da denedim ama bu işe yaramadı. Sanırım kare dalga olmadığı için olabilir mi? CD4017 çıkışlarından birine bağlandığında 6502'yi çalıştırıyordu. Bir saat sinyali almak için yukarıdaki kitlerden birine yama yaptım.

Hala bir saat sinyali almak için farklı yöntemlere bakıyorum.

7. Adım: Sonuç

Bazı karmaşık devrelerin nasıl oluşturulacağını ve minimum miktarda parça ile çalışacak çok basit bir "bilgisayar" elde etmeyi gösterdim. Tabii ki, bilgisayar şu anda pek bir şey yapamıyor veya gelecekte yapması muhtemel.

80'lerin başında, VIC20'mle, harika makineyi merak ederdim ve nasıl bir araya getireceğime dair ilk fikrim yoktu. Zaman ilerledi ve teknoloji de öyle, ancak yine de temellere geri dönmek ve sıfırdan inşa ettiğiniz bir şeyle gurur duymak güzel.

Bu bilgisayarı daha da geliştirmek için, 2k SRAM'ı 0000 ila 2047 $ arasında koymayı ve 1 MHz osilatör eklemeyi planlıyorum. Farklı saat hızlarına erişebilmem için muhtemelen bir CD4040 (12 Aşamalı İkili Dalgalanma Sayacı / Bölücü) gibi bir şey ekleyeceğim.

Sadece yanıp sönen ışıklar yerine metin çıktıları vermek için bir LCD ekran bile ekleyebilir. Bir LCD ekranı çalıştırmak için gereken daha büyük programlarla başa çıkmak için EEPROM programlayıcısının da değiştirilmesi gerekecektir.

MEGA, 6502'nin çalışması için gereksiz hale gelse de, makine kodunda hata ayıklamak için hala kullanışlı oluyor. Herkesin bildiği gibi, makine kodu her zaman hata içerir!

Önerilen: