Isi kandungan:

6502 Minimal Komputer (dengan Arduino MEGA) Bahagian 3: 7 Langkah
6502 Minimal Komputer (dengan Arduino MEGA) Bahagian 3: 7 Langkah

Video: 6502 Minimal Komputer (dengan Arduino MEGA) Bahagian 3: 7 Langkah

Video: 6502 Minimal Komputer (dengan Arduino MEGA) Bahagian 3: 7 Langkah
Video: Mikroprosessor#1-Pengantar Mikroprosessor 2024, Julai
Anonim
6502 Komputer Minimal (dengan Arduino MEGA) Bahagian 3
6502 Komputer Minimal (dengan Arduino MEGA) Bahagian 3

Melangkah lebih jauh lagi, saya sekarang telah menambahkan Octal Latch, 8 LED segi empat tepat dan susunan perintang 220 Ohm ke papan utama. Terdapat juga jumper antara pin dan ground umum array, sehingga LED dapat dimatikan. Pintu 74HC00 NAND telah diganti dengan gerbang 78LS08 AND, pendawaian ke pintu gerbang juga telah diubah. Pintu AND bermaksud bahawa 6522 kini terletak pada $ 6000 dan bukannya $ E000.

Terdapat juga pin untuk sambungan jam luaran untuk menggerakkan 6502. Dengan sambungan ini, tidak perlu MEGA memberikan isyarat jam. MEGA masih memantau apa yang berlaku dengan pemproses seperti sebelumnya.

Saya menggunakan 20 pin 74HC373 untuk selak kerana saya mempunyai beberapa. Ini baik-baik saja semasa di papan roti, tetapi 74HC573 adalah bas yang serasi dan akan menjimatkan banyak pendawaian. UCN5801A yang merupakan 22 pin IC mungkin juga dipertimbangkan dalam litar, tetapi pendawaiannya akan sedikit berbeza.

LED oren tunggal atas adalah penunjuk kuasa dan merah kiri bawah menunjukkan ketika penulisan sedang berlangsung. Yang terakhir ini tidak akan ketara jika papan dijalankan dengan kelajuan yang lebih tinggi.

Litar yang diubah berada di atas (dengan 74HC573).

Langkah 1: Program Demonstrasi

Program Demonstrasi
Program Demonstrasi

Dua program demonstrasi sederhana disertakan dalam monitor 6502 dan kodnya yang dibongkar ada di sini.

Program ini memuatkan 1 ke dalam daftar 6502 A dan menyimpannya di kait. Ia kemudian menambah 1 ke daftar A dan menyimpannya di selak. Kemudian naik kembali ke $ 1005 dan prosesnya berulang selama-lamanya.

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

Program ini pertama kali menetapkan DDR dari port B2222 ke output. Ia kemudian menyimpan $ 55 (B01010101) di pelabuhan serta kait. Daftar A kemudian berputar 1 langkah ke kanan dan sekarang memegang $ AA (B10101010). Ini sekali lagi disimpan di port B dan selak. Program ini melonjak kembali ke $ 1005 dan berterusan selama-lamanya.

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

Mata anda yang tajam mungkin melihat bahawa LED berwarna menunjukkan corak yang berbeza daripada yang hijau. Ini kerana plumbum biasa disambungkan ke 5v pada yang berwarna dan yang biasa di hijau dihubungkan ke tanah.

Tukar baris kod ini ke program2 atau program3.

setDataPins (program3 [mengimbangi]);

Assembler dan Disassembler 6502 adalah alat yang berguna untuk membantu mengekod program anda.

Langkah 2: Menambah EEPROM

Menambah EEPROM
Menambah EEPROM
Menambah EEPROM
Menambah EEPROM
Menambah EEPROM
Menambah EEPROM

Untuk papan EEPROM, saya menggunakan papan jalur 950 x 650 mm dan pin header lelaki 19mm untuk membolehkan papan membersihkan yang di bawahnya. Papan ini dipasang ke papan 6502 di bawah. EEPROM adalah ATMEL 28C256 yang mempunyai 28 pin dan mengandungi memori 32k x 8 bit. Ini lebih memadai untuk program kecil yang sedang digunakan pada masa ini.

Saya belum membuat gambarajah litar untuk papan ini, tetapi agak lurus ke hadapan bagaimana ia menghubungkan ke papan 6502 di bawah. Cip EEPROM ini tidak mesra bas sehingga perlu disambungkan ke pin individu, oleh itu semua "spageti hijau dan putih". Saya telah menyelesaikan masalah merapatkan pada papan sebelumnya dengan memasang talian data bersama di bahagian bawah papan.

14 pin alamat EEPROM bersambung ke pin yang sesuai di sebelah kiri (wayar hijau) dan pin I / O ke pin data di sebelah kanan (wayar putih). Pin 27 (WE) disambungkan ke pin 28 (5v), pin 22 (OE) disambungkan ke tanah dan pin 20 (CE) disambungkan ke pintu NAND. 2 input dari pintu NAND disambungkan ke A15 pada papan utama. Ini bermaksud bahawa apabila pin ini naik tinggi, pintu NAND memberikan isyarat rendah ke pin CE EEPROM yang menjadikannya aktif. Dengan penyediaan ini, ia bermaksud bahawa EEPROM hanya dapat dibaca oleh 6502.

Oleh kerana EEPROM berada di 32k teratas di peta memori, ini bermaksud $ FFFC dan $ FFFD dapat menyimpan alamat permulaan untuk 6502 setelah ia diset semula. Dengan 6522 yang mempunyai alamat antara $ 6000 dan $ 600F dan kaitnya pada $ 4100, ia menghentikan konflik memori.

Vektor NMI ($ FFFA dan $ FFFB) dan vektor BRK / IRQ ($ FFFE anf $ FFFF) juga boleh ditulis dengan cara yang sama.

Langkah 3: Memprogram EEPROM

Mengaturcara EEPROM
Mengaturcara EEPROM
Mengaturcara EEPROM
Mengaturcara EEPROM

Untuk menyimpan program di EEPROM, ia memerlukan pengaturcara. Saya membuat satu dari papan jalur, Arduino Pro Mini, beberapa 74HC595 dan dan soket ZIF. Pada asalnya, programmer dibuat untuk AT28C16 yang mempunyai garis alamat lebih sedikit daripada AT28C256 sehingga harus diubah suai.

Gambarajah litar menunjukkan cara memasang kedua EEPROM ini. Tidak jelas dari foto bahawa kedua-dua 595 cip terbalik dan tidak seperti yang ditunjukkan pada gambar rajah. Pin 1 hingga 7 dari 595/1 berbaris dengan A1 hingga A7 EEPROM tanpa mengira yang digunakan. Ini menjimatkan 7 wayar penyambung. Papannya sekarang kelihatan agak ketat dan ini kerana pada awalnya saya menggunakan soket DIL 24 pin yang kini telah diganti dengan soket ZIF 28 pin yang jauh lebih besar.

Program disertakan yang berfungsi dengan lembaga saya. Program ini akan berfungsi dengan Arduino dan 595 dalam litar seperti yang ditunjukkan. Saya memilih Pro 5v Mini kerana ringkas dan cukup murah untuk ditinggalkan.

Langkah 4: Program EEPROM

Program EEPROM
Program EEPROM

Terdapat tiga program mudah dalam programmer EEPROM. Untuk menggunakannya, hanya melepaskan garis yang anda mahu gunakan.

// Baca dari pelabuhan A 6522

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

Program ini menunjukkan ingatan memori apabila ia selesai. Bahagian program di bawah ini memberi anda kawalan penuh terhadap apa yang anda mahu tulis atau hapus, tetapkan $ FFFC & $ FFFD dan kemudian paparkan kandungan julat tertentu. Hanya melepaskan atau mengubah parameter yang anda perlukan. Alamatnya juga dapat dimasukkan dalam format perpuluhan.

// eraseEEPROM (422, 930, 0x41); // Gunakan untuk menghapus keseluruhan atau sebahagian EEPROM - permulaan, akhir, bait

Serial.println ("Pengaturcaraan EEPROM"); jumlah = program_numerik_data (0x1000); tulisEEPROM (0x7ffc, 0x00); // Tetapkan $ FFFC untuk 6502 writeEEPROM (0x7ffd, 0x90); // Tetapkan $ FFFD untuk 6502 // writeEEPROM (0x1000, 0xA9); // Tulis 1 bait data Serial.println ("selesai"); Garis rentetan = "Bertulis" + (Rentetan) jumlah + "bait"; Serial.println (garis besar); Serial.println ("Membaca EEPROM"); printContents (0x0000, 0x112f); // Tetapkan julat untuk memaparkan printContents (0x7ff0, 0x7fff); // Membaca 16 bait terakhir di EEPROM

Hasil ringkas dari program ada di atas.

Langkah 5: Menjalankan 6502 Dari EEPROM

Menjalankan 6502 Dari EEPROM
Menjalankan 6502 Dari EEPROM
Menjalankan 6502 Dari EEPROM
Menjalankan 6502 Dari EEPROM
Menjalankan 6502 Dari EEPROM
Menjalankan 6502 Dari EEPROM

EEPROM yang diprogramkan kini boleh dimasukkan ke dalam papannya dan piggy ini kembali ke papan utama 6502 yang mana piggy kembali ke MEGA. Foto pandangan sisi dan atas di atas menunjukkan bagaimana semuanya sesuai.

6502 kini dapat membaca vektor permulaan dari $ FFFC dan $ FFFD (yang bernilai $ 9000) dan kemudian melompat ke program yang disimpan di sana. MEGA masih memberikan isyarat jam dan programnya perlu diubah untuk memberikan hanya isyarat jam dan memantau 6502. Program yang diubah suai disediakan untuk melakukan ini.

Foto yang sedang berjalan menunjukkan program ini berjalan.

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

Suis dipasang ke port A dan program memaparkan nilai yang dibacanya di port B dan 74HC373 (yang dikaburkan pada masa ini). suis disambungkan ke tanah dan LED disambungkan ke 5v. EOR # $ FF membetulkan masalah selak dan port B memaparkan corak yang berbeza dengan membalikkan bit sebelum menulis ke kait.

Langkah 6: Isyarat Masa Luaran

Isyarat Masa Luaran
Isyarat Masa Luaran

Sekiranya isyarat jam digunakan pada pin di bahagian atas papan, 6502 kini boleh berjalan secara bebas dari MEGA. Sudah tentu ia juga memerlukan bekalan kuasa. Saya telah bereksperimen dengan jam yang berbeza dan bahkan menjalankan 6502 pada 1MHz dengan pengayun kristal. MEGA tidak dapat mengikuti kecepatan yang lebih cepat, jadi harus dikeluarkan.

Saya juga mencuba output dari pemasa 555 tetapi itu tidak berjaya. Saya fikir ia mungkin kerana ia bukan gelombang persegi? Apabila disambungkan ke salah satu output CD4017, ia mendorong 6502. Saya memasukkan salah satu kit di atas untuk mencuba dan mendapatkan isyarat jam.

Saya masih mencari kaedah yang berbeza untuk mendapatkan isyarat jam.

Langkah 7: Kesimpulannya

Saya telah menunjukkan cara membina beberapa litar yang kompleks dan mendapatkan "komputer" yang sangat mudah untuk berfungsi dengan jumlah bahagian yang minimum. Memang, komputer tidak dapat melakukan banyak perkara pada masa ini atau kemungkinan akan dilakukan pada masa akan datang.

Pada awal tahun 80-an, dengan VIC20 saya, saya sering tertanya-tanya pada mesin yang hebat dan tidak mempunyai idea pertama tentang bagaimana untuk mula menyatukannya. Masa telah maju dan begitu juga dengan teknologi, tetapi masih bagus untuk kembali ke asas dan berbangga dengan sesuatu yang telah anda bina dari awal.

Untuk mengembangkan lagi komputer ini, saya berhasrat untuk meletakkan 2k SRAM pada $ 0000 hingga $ 2047 dan menambahkan pengayun 1 MHz. Mungkin akan menambah sesuatu seperti CD4040 (12-Stage Binary Ripple Counter / Divider) supaya saya dapat memanfaatkan kelajuan jam yang berbeza.

Bahkan mungkin menambah paparan LCD untuk memberikan output teks daripada hanya menyala lampu. Pengaturcara EEPROM juga perlu dimodifikasi untuk menangani program yang lebih besar yang diperlukan untuk menjalankan paparan LCD.

Walaupun MEGA menjadi tidak perlu untuk menjalankan 6502, ia masih berguna untuk menyahpepijat kod mesin. Seperti yang diketahui, kod mesin selalu mengandungi pepijat!

Disyorkan: