Talaan ng mga Nilalaman:

6502 Minimal Computer (kasama ang Arduino MEGA) Bahagi 3: 7 Mga Hakbang
6502 Minimal Computer (kasama ang Arduino MEGA) Bahagi 3: 7 Mga Hakbang

Video: 6502 Minimal Computer (kasama ang Arduino MEGA) Bahagi 3: 7 Mga Hakbang

Video: 6502 Minimal Computer (kasama ang Arduino MEGA) Bahagi 3: 7 Mga Hakbang
Video: Сборка и обзор - PE6502 Hobby Computer 2024, Nobyembre
Anonim
6502 Minimal Computer (kasama ang Arduino MEGA) Bahagi 3
6502 Minimal Computer (kasama ang Arduino MEGA) Bahagi 3

Ang paglipat pa rin ng karagdagang, nagdagdag na ako ngayon ng isang Octal Latch, 8 mga parihabang LED at isang 220 Ohm resistor array sa pangunahing board. Mayroon ding isang lumulukso sa pagitan ng karaniwang pin at ground ng array, upang ang mga LED ay maaaring patayin. Ang 74HC00 NAND gate ay napalitan ng isang 78LS08 AT gate, ang mga kable sa gate ay nabago din. Ang ibig sabihin ng gate ng AND na ang 6522 ay matatagpuan ngayon sa $ 6000 sa halip na $ E000.

Mayroon ding isang pin para sa koneksyon ng isang panlabas na orasan upang himukin ang 6502. Sa koneksyon na ito, hindi na kailangan para sa MEGA na magbigay ng isang signal ng orasan. Sinusubaybayan pa rin ng MEGA kung ano ang nangyayari sa processor tulad ng dati.

Gumamit ako ng 20 pin 74HC373 para sa aldaba dahil mayroon akong ilang. OK lang ito kapag nasa breadboard, ngunit ang isang 74HC573 ay katugma sa bus at makatipid ng maraming mga kable. Ang UCN5801A na isang 22 pin IC ay maaari ring isaalang-alang sa circuit, ngunit ang mga kable ay bahagyang magkakaiba.

Ang tuktok, solong orange LED ay isang tagapagpahiwatig ng kuryente at ang mas mababang kaliwang pula ay nagpapahiwatig kapag may isulat. Ang huli ay magiging hindi gaanong mahalaga kung ang board ay pinatakbo sa mas mataas na bilis.

Ang binagong circuit ay nasa itaas (kasama ang 74HC573).

Hakbang 1: Mga Programa ng Demonstrasyon

Mga Programa ng Demonstrasyon
Mga Programa ng Demonstrasyon

Dalawang simpleng mga programa sa pagpapakita ang kasama sa monitor ng 6502 at narito ang kanilang disassembled code.

Ang program na ito ay naglo-load ng 1 sa 6502 Isang rehistro at iniimbak ito sa aldaba. Pagkatapos ay nagdaragdag ito ng 1 sa isang rehistro ng A at iniimbak iyon sa aldaba. Pagkatapos ay tumalon ito pabalik sa $ 1005 at ang proseso ay umuulit magpakailanman.

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

Ang program na ito ay unang nagtatakda ng DDR ng 6522 port B sa output. Pagkatapos ay nag-iimbak ito ng $ 55 (B01010101) sa port pati na rin ang aldaba. Ang A register ay paikutin ang 1 hakbang pakanan at ngayon ay mayroong $ AA (B10101010). Inimbak muli ito sa port B at sa aldaba. Ang programa ay tumalon pabalik sa $ 1005 at nagpapatuloy magpakailanman.

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

Ang matalim na mata sa gitna mo ay maaaring mapansin na ang mga may kulay na LED ay nagpapakita ng ibang pattern kaysa sa mga berde. Ito ay dahil ang karaniwang tingga ay konektado sa 5v sa mga may kulay at ang karaniwan sa berde ay konektado sa lupa.

Baguhin ang linya ng code na ito sa program2 o program3.

setDataPins (program3 [offset]);

Ang isang 6502 Assembler at Disassembler ay kapaki-pakinabang na tool upang matulungan ang pag-encode ng iyong mga programa.

Hakbang 2: Pagdaragdag ng isang EEPROM

Pagdaragdag ng isang EEPROM
Pagdaragdag ng isang EEPROM
Pagdaragdag ng isang EEPROM
Pagdaragdag ng isang EEPROM
Pagdaragdag ng isang EEPROM
Pagdaragdag ng isang EEPROM

Para sa board ng EEPROM, gumamit ako ng 950 x 650 mm strip board at 19mm male header pin upang paganahin ang board sa isa sa ilalim. Ang board na ito ay naka-plug sa 6502 board sa ibaba. Ang EEPROM ay isang ATMEL 28C256 na mayroong 28 pin at naglalaman ng 32k x 8 piraso ng memorya. Ito ay higit pa sa sapat para sa mga maliliit na program na ginagamit sa kasalukuyan.

Hindi ko pa nagagawa ang isang diagram ng circuit para sa board na ito, ngunit ito ay medyo tuwid kung paano ito kumokonekta sa 6502 board sa ibaba. Ang mga EEPROM chip na ito ay hindi magiliw sa bus kaya kailangang mai-wire sa mga indibidwal na pin, kaya't lahat ng "berde at puting spaghetti". Nalutas ko ang isyu sa bridging sa naunang board sa pamamagitan ng pag-wire ng mga linya ng data na magkasama sa ilalim ng board.

Ang 14 address pin ng EEPROM ay kumonekta sa naaangkop na mga pin sa kaliwang kamay (berdeng mga wire) at ang mga I / O na pin sa mga data pin sa kanan (puting mga wire). Ang Pin 27 (WE) ay konektado sa pin 28 (5v), pin 22 (OE) ay konektado sa ground at ang pin 20 (CE) ay konektado sa isang NAND gate. Ang 2 input ng gate ng NAND ay konektado sa A15 sa pangunahing board. Nangangahulugan ito na kapag mataas ang pin na ito, ang gate ng NAND ay nagbibigay ng isang mababang signal sa CE pin ng EEPROM na ginagawang aktibo ito. Sa set up na ito nangangahulugan ito na ang EEPROM ay mababasa lamang ng 6502.

Habang ang EEPROM ay nakatira sa tuktok na 32k sa memorya ng memorya, nangangahulugan ito na ang $ FFFC at $ FFFD ay maaaring hawakan ang address ng pagsisimula para sa 6502 matapos itong mai-reset. Sa pagkakaroon ng 6522 mga address nito sa pagitan ng $ 6000 at $ 600F at ang aldaba ay nasa $ 4100, pinahinto nito ang anumang mga salungatan sa memorya.

Ang NMI vector ($ FFFA at $ FFFB) at BRK / IRQ vector ($ FFFE anf $ FFFF) ay maaari ding isulat sa parehong paraan.

Hakbang 3: Programming ang EEPROM

Programming ang EEPROM
Programming ang EEPROM
Programming ang EEPROM
Programming ang EEPROM

Upang maiimbak ang isang programa sa EEPROM, kailangan nito ng isang programmer. Gumawa ako ng isa mula sa isang strip board, isang Arduino Pro Mini, isang pares na 74HC595's at at isang ZIF socket. Orihinal, ang programmer ay ginawa para sa isang AT28C16 na may mas kaunting mga linya ng address kaysa sa AT28C256 kaya't dapat mabago.

Ipinapakita ng circuit diagram kung paano i-wire ang pareho ng mga EEPROMs na ito. Hindi malinaw mula sa larawan na ang dalawang 595 chips ay baligtad at hindi tulad ng ipinakita sa diagram. Ang mga linya ng 1 hanggang 7 ng 595/1 ay pumila kasama ang A1 hanggang A7 ng EEPROM anuman ang ginagamit. Sine-save nito ang 7 na kumokonekta na mga wire. Ang board ngayon ay mukhang medyo masikip at ito ay dahil orihinal na gumamit ako ng isang 24 pin na socket ng DIL na ngayon ay pinalitan ng mas malaking 28 pin na socket ng ZIF.

Ang isang programa ay kasama na gumagana sa aking board. Ang programa ay gagana sa anumang Arduino at 595 sa isang circuit tulad ng ipinakita. Pinili ko ang isang 5v Pro Mini dahil ito ay compact at murang sapat upang umalis sa set up.

Hakbang 4: Ang Mga Programang EEPROM

Ang Mga Programang EEPROM
Ang Mga Programang EEPROM

Mayroong tatlong simpleng mga programa sa EEPROM programmer. Upang magamit ang mga ito, i-unsment lang ang linya na nais mong gamitin.

// Basahin mula sa port A ng 6522

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

Nagpapakita ang programa ng isang memory dump kapag natapos na ito. Ang bahagi ng programa sa ibaba ay nagbibigay sa iyo ng buong kontrol ng kung ano ang nais mong isulat o burahin, nagtatakda ng $ FFFC & $ FFFD at pagkatapos ay ipinapakita ang mga nilalaman ng isang naibigay na saklaw. I-komento lamang o baguhin ang mga parameter ayon sa kinakailangan mo. Ang mga address ay maaari ding ipasok sa decimal format.

// eraseEEPROM (422, 930, 0x41); // Gumamit upang burahin ang buo o bahagi ng EEPROM - simulan, tapusin, byte

Serial.println ("Programming EEPROM"); halaga = program_numeric_data (0x1000); magsulatEEPROM (0x7ffc, 0x00); // Itakda ang $ FFFC para sa 6502 writeEEPROM (0x7ffd, 0x90); // Itakda ang $ FFFD para sa 6502 // writeEEPROM (0x1000, 0xA9); // Sumulat ng 1 byte ng data Serial.println ("tapos na"); Strline outline = "Nakasulat" + (String) halaga + "bytes"; Serial.println (balangkas); Serial.println ("Pagbasa ng EEPROM"); mga Nilalaman sa pag-print (0x0000, 0x112f); // Itakda ang saklaw upang maipakita ang mga naka-print na Nilalaman (0x7ff0, 0x7fff); // Nagbabasa ng huling 16 bytes sa EEPROM

Ang isang pinaikling output mula sa programa ay nasa itaas.

Hakbang 5: Pagpapatakbo ng 6502 Mula sa EEPROM

Pagpapatakbo ng 6502 Mula sa EEPROM
Pagpapatakbo ng 6502 Mula sa EEPROM
Pagpapatakbo ng 6502 Mula sa EEPROM
Pagpapatakbo ng 6502 Mula sa EEPROM
Pagpapatakbo ng 6502 Mula sa EEPROM
Pagpapatakbo ng 6502 Mula sa EEPROM

Ang nai-program na EEPROM ay maaari nang ipasok sa board nito at ang piggy na ito ay bumalik sa pangunahing 6502 board kung saan ang piggy ay bumalik sa MEGA. Ipinapakita ng mga larawan sa gilid at tuktok na pagtingin sa kung paano magkakasama ang lahat.

Mababasa na ng 6502 ang start vector mula sa $ FFFC at $ FFFD (na kung saan ay $ 9000) at pagkatapos ay tumalon sa programa na nakaimbak doon. Nagbibigay pa rin ang MEGA ng signal ng orasan at ang programa nito ay kailangang mabago upang makapagbigay lamang ng signal ng orasan at subaybayan ang 6502. Isang nabagong programa ang ibinigay upang magawa ito.

Ipinapakita ng tumatakbo na larawan ang program na ito na tumatakbo.

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

Ang mga switch ay naka-plug sa port A at ipinapakita ng programa ang halagang binabasa nito sa port B at sa 74HC373 (na nakakubli sa kasalukuyan). ang mga switch ay konektado sa lupa at ang mga LED ay konektado sa 5v. Inaayos ng EOR # $ FF ang problema ng aldaba at port B na nagpapakita ng iba't ibang mga pattern sa pamamagitan ng pag-flip ng mga piraso bago isulat sa aldaba.

Hakbang 6: Panlabas na Signal ng Oras

Panlabas na Signal ng Oras
Panlabas na Signal ng Oras

Kung ang isang signal ng orasan ay inilapat sa pin sa tuktok ng board, ang 6502 ay maaari nang tumakbo nang nakapag-iisa ng MEGA. Siyempre kailangan din nito ng isang supply ng kuryente. Nag-eksperimento ako sa iba't ibang mga orasan at kahit na patakbuhin ang 6502 sa 1MHz gamit ang isang kristal oscillator. Hindi makasabay ang MEGA sa mas mabilis na bilis, kaya't dapat itong alisin.

Sinubukan ko rin ang output mula sa isang 555 timer ngunit hindi ito gagana. Sa palagay ko maaaring ito dahil hindi ito isang square wave? Kapag nakakonekta sa isa sa mga output ng CD4017, hinimok nito ang 6502. Nag-patch ako sa isa sa mga kit sa itaas upang subukan at makakuha ng isang signal ng orasan.

Tumitingin pa rin ako sa iba't ibang mga pamamaraan upang makakuha ng isang signal ng orasan.

Hakbang 7: Konklusyon

Ipinakita ko kung paano bumuo ng ilang mga kumplikadong mga circuit at makakuha ng isang napaka-simpleng "computer" upang gumana sa isang kaunting halaga ng mga bahagi. Totoo, ang computer ay hindi makagawa ng malaki sa kasalukuyan o malamang na gawin ito sa hinaharap.

Bumalik sa unang bahagi ng 80, sa aking VIC20, nagtataka ako sa kahanga-hangang makina at walang unang ideya kung paano magsisimulang magkasama. Ang oras ay lumipat at pati na rin ang teknolohiya, ngunit masarap pa rin na bumalik sa mga pangunahing kaalaman at ipagmalaki ang isang bagay na iyong naitayo mula sa simula.

Upang higit pang paunlarin ang computer na ito, balak kong maglagay ng 2k ng SRAM sa $ 0000 hanggang $ 2047 at magdagdag ng isang 1 MHz oscillator. Marahil ay magdagdag ng isang bagay tulad ng isang CD4040 (12-Stage Binary Ripple Counter / Divider) upang maaari akong mag-tap sa iba't ibang mga bilis ng orasan.

Maaaring magdagdag pa ng isang LCD display upang magbigay ng mga output ng teksto kaysa sa mga ilaw na kumikislap lamang. Ang programmer ng EEPROM ay kailangan ding mabago upang harapin ang mas malaking mga program na kinakailangan upang magpatakbo ng isang LCD display.

Kahit na ang MEGA ay nagiging hindi kinakailangan para sa pagpapatakbo ng 6502, magagamit pa rin ito para sa pag-debug ng machine code. Tulad ng alam ng sinuman, palaging naglalaman ang machine code ng mga bug!

Inirerekumendang: