Sadržaj:
- Korak 1: Brzi pregled promjena + sheme
- Korak 2: CPU, memorija i kontrola memorije
- Korak 3: LED diode statusa sustava
- Korak 4: Unos i izlaz
- Korak 5: Poništite i dovršite unos i izlaz
- Korak 6: Programiranje
Video: Ponovno posjetite računalo Z80: 6 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:32
U prošlosti sam napisao vodič o tome kako izgraditi računalo zasnovano na Z80 i dizajnirao sam krug što je moguće pojednostavnjenije kako bi se mogao izgraditi što je moguće lakše. Napisao sam i mali program koristeći istu ideju jednostavnosti. Ovaj je dizajn prilično dobro funkcionirao, ali nisam bio potpuno zadovoljan s njim. Počeo sam s prepisivanjem programa koji mu je omogućio programiranje za vrijeme izvođenja. To mi je omogućilo da testiram komade koda, a da ga ne moram posvetiti EEPROM -u, što bi zauzvrat zahtijevalo od mene da ponovno programiram EEPROM. Ovo mi nije zvučalo kao zabavna ideja. Tada sam počeo razmišljati o memorijskim prostorima. Ako želim spojiti komad hardvera (uglavnom IO), komad koda bi potencijalno mogao premašiti količinu memorijskog prostora dostupnog sustavu. Upamtite, dizajn je koristio samo donji bajt sabirnice adresa, a zatim je donji bit visokog bajta korišten za odabir između prostora ROM -a i RAM -a. To je značilo da imam samo 253 bajta prostora za korištenje. Možda se pitate zašto 253 umjesto 256. To je zato što moj novi kôd ubacuje tri bajta podataka na kraju pisanog programa (to će biti obrađeno kasnije, jer sam ga izmijenio za rad na novom dizajnu).
n
Vratio sam se na stare sheme da vidim što se još događa. Otkrio sam mali nedostatak u krugu odabira memorije, koji ću pokriti kad tamo stignem. Pojednostavljena verzija: svi bi zahtjevi za pisanje zapravo prolazili, iako su se uvijek stavljali u RAM. Ovo vjerojatno nije bilo ništa zbog čega bi se trebalo zabrinjavati, ali ovaj put sam to htio učiniti kako treba. I time sam počeo crtati novu shemu. Dvije slike priložene na ovoj stranici su prije i poslije stvarnog kruga. Očistio sam toliko ožičenja od špageta, to nije smiješno.
n
Ako ste slijedili moj izvorni podnesak i planirate slijediti ovaj, mrzit ćete me. Ako počinjete iznova, imate sreće. Samo zgrabite dijelove na popisu (ili njihov ekvivalent) i slijedite ih.
Pribor:
LM7805 - 5 -voltni regulatorZ80 - CPU; mozgovi sustavaAT28C64B - EEPROM. "Trajna" pohrana podataka koja se koristi za firmver računalaIDT6116SA - SRAM; koristi se za spremanje korisničkog koda i /ili opće pohrane podatakaNE555 - Sat sustava74HC374 - Oktalna D -zasun sa /OE; koristi se kao ulazni čip74LS273 - Oktalna D -zasun sa /MR; izlazni čipTLC59211 - LED upravljački čip (koristi se tako da 74LS273 može pokretati LED diode, jer sam po sebi nije sposoban za trenutni izlaz) MC14572 - Ovo je čip "Line Driver", ali smatrao sam da je savršen za logiku upravljanja memorijom. Ima 4 pretvarača i ugrađena vrata NAND i NOR74LS32 - Četvero ILI vrataCD4001 - Četvero NOR vrata CD4040 - Brojač talasa od 12 stupnjeva; Ucrtani, ali ne implementirani razdjelnik sata (za rad sustava pri sporijim brzinama takta) 2 10K ohmskih otpornika - jedan se koristi u krugu mjerača vremena 555, pa upotrijebite koju god vrijednost želite za njega 4 1 ohmski otpornik - jedan se koristi za 555 timer, pa upotrijebite što god želite za to. Drugi se koristi za pogon LED dioda, pa ga i promijenite ako želite sabirnicu otpornika 8x330 Ohma8 x 10K ohmsku sabirnicu otpornika11 LED - tri se koriste za status sustava, a ostalih osam su izlazi. Za 8 sam koristio prikaz stupčastog grafikona (HDSP -4836) 4 kondenzatora - dva se koriste LM7805; 0,22 uF i 0,1 uF. Jedan je za mjerač vremena 555, pa upotrijebite ono što smatrate da je ispravno. Posljednji je za resetiranje pri uključivanju; 100uF2 N. O. Tipke - Jedan se koristi za unos, drugi za resetiranje8 SPST DIP sklopke - Unos podataka; Koristio sam stil žice za klavirski ključ. Puno, puno žice
n
NAPOMENA: MC14572 verzija s rupom zastarjela je, ali verzija SMD -a je i dalje aktivna (čak ni u statusu "nije za novi dizajn"), pa ćete možda morati kupiti ploču kako biste je mogli koristiti. Drugi 74LS32 može se koristiti umjesto MC14572 (pogledajte shemu "krug odabira memorije" iz prethodne tabele)
Korak 1: Brzi pregled promjena + sheme
Kako čitati sheme: Strelica usmjerena u čip je ulaz: Ulaz>-Strelica usmjerena od čipa je izlaz: Izlaz <-Autobusi koriste liniju umjesto strelice: Sabirnica |-
n
Većina čipova izvučena je s točnim isječcima. Mali pad je izvučen na ovim čipovima. Većina čipova također ima pin brojeve i oznake. Možda ih je malo teško čitati. Olovka mi je postajala tupa.
n
Što se tiče spojeva na strujna kola, izgled novog dizajna uglavnom se ne mijenja u odnosu na izvornik. Spojio sam donji dio gornjeg bajta adrese s memorijama, a zatim sam upotrijebio niži bit gornjeg grickalica (A12) za odabir RAM -a/ROM -a. To je značilo da je ROM prostor prešao s 0000-00FF na 0000-0FFF. Ram prostor je prešao s 0100-01FF na 1000-1FFF. Također sam zamijenio logiku kontrole memorije za bolji dizajn i dodao dvije nove LED diode statusa (i nešto logike ljepila). Također sam nacrtao (ali nisam spojio) krug razdjelnika sata. Trebalo je obavljati dvije funkcije. Očigledna funkcija je podijeliti frekvenciju takta prema dolje. Druga funkcija je za PWM (Pulse Width Modulation), budući da 555 ne generira valove s 50% radnih ciklusa. U ovom krugu to zapravo nije važno, ali ako želite koristiti sat za pokretanje nekih LED dioda, zasigurno ćete primijetiti učinke (jedna (set) LED dioda (i) bit će slabije od druge). Cijeli ostatak kola je u biti nepromijenjen.
Korak 2: CPU, memorija i kontrola memorije
Ovo je dio u kojem me čitatelji moje prethodne verzije mrze. U izvornoj verziji jednostavno sam bacio dijelove na ploču na mjesto na kojem su izgledali kao da bi nametnuli mali problem s povezivanjem. Rezultat je izgledao kao da je netko na njega izbacio tanjur špageta i bio je poput "žica!" Htio sam ga malo očistiti pa sam počeo tako da sam iscrpio sve osim CPU -a, RAM -a i ROM -a. Povukao sam gotovo cijeli ulazni krug, izlazni krug i logiku ljepila. To me gotovo boljelo, ali bilo je potrebno. Ostavio sam sve podatkovne veze netaknutima i donji bajt sabirnice adresa. Zatim sam spojio sljedeća četiri bita sabirnice adresa (A8-A11) na ROM čip. Ovaj put sam se pobrinuo da zaobiđem čip kako bih ga lakše povukao za reprogramiranje. Također sam preskočio adresne veze do RAM čipa.
n
S tim u vezi, sad sam morao povezati logiku upravljanja memorijom. U izvornoj shemi, spojio sam liniju procesora /MREQ izravno na /CE na oba memorijska čipa, zatim sam spojio /WR na RAM -ove /WE. Zatim sam logički imao CPU -ove /RD i /MREQ ILI zajedno, kao i A9. U osnovi, postavljeno je tako da su svi memorijski zahtjevi aktivirali i RAM i ROM, ali A9 je korišten za odabir koji od čipova /OE je izabran. To je bilo u redu, a sve zato što su čipovi ostali neaktivni sve dok se ne postavi memorijski zahtjev, a zatim bi samo jedan /OE bio aktivan tijekom zahtjeva za čitanjem. Time je spriječeno preslušavanje, ali je unesena neugodna nijansa. Budući da se A9 koristio samo za određivanje čipa koji ispisuje podatke i zato što je CPU imao izravan pristup RAM -u /WE pin -u, svi i svi zahtjevi za upis bi se prošli. To je bilo u redu za ROM jer je njegov način pisanja onemogućen vezanjem /WE izravno na 5V napajanje. Na RAM bi se, međutim, pisalo bez obzira na A9. To je značilo da bi pokušaj pisanja na mjesto ROM prostora pisao na isto mjesto u RAM prostoru.
n
Jedno rješenje za to bilo bi ponovno povezivanje upravljačke logike tako da CPU ima izravan pristup pinovima čipova /OE i /WE, a zatim pomoću MREQ i A12 za odabir čipova /CE -a koji se pokreću. Krenuo sam s ovom idejom, ali umjesto da sam koristio četiri NOR vrata i pretvarač poput originalnog dizajna, pronašao sam nezgodan mali čip koji je bio savršen za taj zadatak. Morao sam stvoriti sklop koji je koristio samo logička vrata dostupna u čipu, ali to je bilo dovoljno jednostavno. A12 se napaja izravno u vrata NAND i vrata NOR. /MREQ se dovodi na vrata NOR, a njegov kompliment na vrata NAND. NAND vrata se koriste za pogon /CE za RAM, a NOR izlaz se obrće i koristi za pogon ROM /CE. To znači da /MREQ mora biti nizak prije nego što se odabere bilo koji čip, a zatim A12 bira koji će biti odabran. S ovom postavkom, sada svi zahtjevi za upisivanje na ROM neće ništa učiniti. Također štedi energiju jer je samo jedan čip aktivan umjesto oba. Što se tiče samog logičkog čipa, unutra imamo još dva neiskorištena pretvarača. Jedan će se kasnije naviknuti, ali stići ćemo tamo kad stignemo.
Korak 3: LED diode statusa sustava
Prije nego što sam započeo ovaj projekt, pokušavao sam se povezati s određenim IC -om, ali sam imao problema s tim. Nisam siguran što se događa, upotrijebio sam LED za montiranje ploče za ispitivanje (jedan od onih sklopova koji ima ugrađen otpornik). To mi je dalo nostalgičnu ideju koja se i danas koristi: LED diode statusa su označavale čita li se memorija ili se u nju piše. Trebalo ga je koristiti zajedno s ulaznom LED diodom koju sam već imao. Ulazna LED dioda bila je spojena na /WAIT generator signala kako bi nam ukazao da sustav čeka ulaz (doći ću, ne brinite). Razmišljao sam o dodavanju LED -a za označavanje IO zapisa, ali sam zaključio da bi promjena izlaznih LED -ova već bila odličan pokazatelj toga. Razmišljajući, možda ću ga još dodati. Bez obzira na to, smatram da je korisno znati čita li se ili piše memorija. Pa, ionako je korisno za otklanjanje pogrešaka u programu. Zapravo sam ga jako koristio kao takav pokušavajući pokrenuti svoj program: „zašto piše u memoriju? To još ne bi trebao činiti!"
n
Za kontrolu ovih LED dioda koristio sam quad NOR vrata. Koristio sam sve kapije. Za generiranje statusnih signala korištena su samo dva, ali čip nema mogućnosti napajanja za pokretanje LED dioda. Sposobni su potopiti toliko snage, pa sam koristio druga dva NOR vrata kao pretvarače i kao takve spojio LED diode. Budući da se jedna LED koristi za označavanje očitavanja, a druga za pisanje, a zahtjev za čitanjem i pisanjem neće se pojaviti u isto vrijeme, uspio sam pobjeći koristeći samo jedan otpornik za obje LED diode. Što se tiče signala koje sam trebao dekodirati, to je također bilo dovoljno jednostavno. Htio sam da se označe svi zahtjevi za čitanje memorije, tako da je prvi NOR gate imao /MREQ i /RD na svojim ulazima. Status pisanja bio je malo teži, ali jednako jednostavan. I dalje sam koristio /MREQ kao jedan ulaz, ali korištenje /WR kao drugog uzrokovalo bi manju nijansu koju sam htio izbjeći. To bi označilo SVE zahtjeve za pisanje. Željela sam samo one koje su zapravo prošle. Pa kako bih to učinio? Pa, sjetite se kako sam postavio sustav tako da se može zapisati samo RAM? Koristio sam RAM -ove /CE kao drugi ulaz za vrata NOR. To znači da će LED lampica svijetliti samo kada se odabere RAM i podnese zahtjev za upis. Što se tiče LED boje, odabrao sam narančastu kao indikator čitanja (ali pronašao sam samo žute) i crvenu kao indikator pisanja.
Korak 4: Unos i izlaz
U prethodnom ste koraku možda primijetili da sam neke od ostalih komponenti već dodao na ploču. Rezervirao sam prostor kako ne bih slučajno postavio žice tamo gdje želim komponentu (stoga bih morao pronaći novo mjesto za spomenutu komponentu). Možda ste također primijetili da sam ostavio ulazne prekidače na mjestu i ožičen do razvodnika. Odlučio sam da je izvorno mjesto savršeno mjesto i odlučio sam postaviti izlazne LED diode u blizini (gore). Desno od prikaza trake nalazi se ulazni zasun. Iznad toga je izlazna zasun, a lijevo od nje je LED pogonitelj. Počeo sam povezivanjem zaslona s upravljačkim programom jer je to bilo najlakše učiniti. Zatim sam spojio prekidače na ulaznu stranu ulaznog zasuna. Zatim sam spojio izlaznu stranu izlaznog zasuna na LED upravljački program. Ovo se može činiti kao neugodna naredba za povezivanje, ali to je bilo s razlogom. Ulaz izlaznog zasuna trebao je biti spojen na sabirnicu podataka, kao i izlaz ulaznog zasuna. Ideja je bila spojiti izlaze ulaznog zasuna s ulazima izlaznog zasuna, što sam i učinio. Tada sam samo trebao povezati taj nered sa sabirnicom podataka. Nije bilo važno kamo su te veze fizički otišle jer bi sve bile električno povezane. Računalo je sada gotovo.
Korak 5: Poništite i dovršite unos i izlaz
Nažalost, nema slika za ovaj korak. Slike potražite u prethodnom koraku.
n
Možda ste primijetili na posljednjoj slici prethodnog koraka da sam imao zeleni gumb i instaliran drugi logički čip. Čip je vrata ILI. Dva se vrata koriste za generiranje /WAIT signala. Pa, signal se generira pomoću OR-ing /IORQ i /RD iz procesora. Izlaz se dovodi u druga vrata, gdje ponovno dolazi ILI na gumb. Gumb dovodi ulaz vrata visoko, čime se izlaz dovodi visoko. Ovaj izlaz se dovodi na procesore /WAIT pin. Dok nije pritisnut, otpornik drži ulaz niskim. U početku sam koristio 10K otpornik, ali LS32 je zapravo gasio napon na ulazu. Otpornik nije pao dovoljno nisko i morao sam ga zamijeniti 1K. U svakom slučaju, ideja je da kad se uputi zahtjev za čitanje IO -a, prvi i drugi ulaz ILI govore procesoru da pričeka. Nakon što postavite ulazne prekidače na sve što želite, pritisnite gumb i to dovodi CPU iz stanja čekanja. Zelena "ulazna" LED dioda, kako sam je nazvao u ranijem koraku, ožičena je tako da kad se pin /WAIT spusti, svijetli.
n
Ali još nismo završili. Ulazni japanka treba signal koji mu daje do znanja kada je unos podataka ispravan i treba ga staviti u CPU. Ovaj pin sata je visoko aktivan. Prije smo ga samo povezali s gumbom. Ovo je još uvijek valjana opcija, ali ovaj put sam je odabrao staviti na isti izlaz kao i druga vrata ILI. Ovaj IC također ima /OE pin koji treba voziti. Da se drži visoko, nikada ne bi umetnuo podatke u sabirnicu. Da se drži nisko, uvijek bi vozio autobus. Da bih to ispravio, jednostavno sam upotrijebio treći ulaz ILI. Ulazi su /IORQ i /RD, a izlaz ide izravno na zasun /OE.
n
Izlazni zasun također treba pokrenuti pin sata. Opet, aktivan je visoko. U mojoj shemi, nacrtao sam četvrta vrata ILI izravno upravljajući iglom pomoću /IORQ i /WR. To je značilo da će se igla sata držati visoko sve dok se ne upiše zahtjev za upis, zatim će pasti nisko pa opet visoko. To bi vjerojatno bilo u redu jer bi podatkovna sabirnica i dalje imala valjane podatke o sebi odmah nakon pokušaja upisivanja, ali s inženjerskog stajališta bio je dizajn smeća. Ovu sam pogrešku primijetio tek nakon što sam snimio posljednje fotografije, ali sam prekinuo tu vezu, a zatim ulazni izlaz OR gate -a ušao u jedan od neiskorištenih pretvarača iz logike upravljanja memorijom, a zatim spojio njegov izlaz na pin sata. Također sam popravio shemu i otkrio drugu pogrešku koju sam napravio. I ja sam to ispravio.
n
Nakon što je sve to konačno učinjeno, morao sam obaviti vrlo malu količinu posla: sklop za resetiranje. Dodao sam gumb na ploču i upotrijebio 10K otpornik da jednu stranu držim visoko. Druga strana ide izravno na tlo. Visoko podignuta strana je /RESET izlaz, koji je išao na svaki čip s pinom /RESET (CPU i izlazna zasuna). Kako bih postigao reset pri uključivanju, na izlaz /RESET dodao sam kondenzator. Ideja je da bi otpornik velike vrijednosti uzrokovao da se relativno veliki kondenzator sporo puni i zadrži pinove /RESET nisko za određenu količinu ciklusa takta (CPU -u su potrebna četiri ciklusa takta). Vjerojatno već možete pogoditi koja je negativna strana ovog kruga. Isti je negativ kao i prethodna verzija jer je isti krug. Kad se pritisne tipka, kondenzator se u biti kratko spaja kroz gumb. To je loše i za čep i za gumb, pa ako svoju građevinu želite učiniti trajnijom, možda ćete je htjeti redizajnirati. Razmišljao sam o drugom mjeraču vremena 555 postavljenom u monostabilnom načinu rada. No time je računalni krug sada dovršen. Da. Sada to treba programirati.
Korak 6: Programiranje
Programiranje ove stvari bilo je prava mora. Napravio sam Arduino EEPROM programer. Nije uspjelo. Napravio sam još jedan na temelju tuđeg dizajna i kodiranja. I dalje nije radilo. Vratio sam se na provjerenu metodu ručnog postavljanja adresa i bajtova podataka ručno. Nekako sam to zabrljao. Pokušao sam ponovo i ipak sam pogriješio. Vratio sam se još jednom i otkrio da je isključen za jedan bajt, pa sam ga ispravio i napokon je uspjelo, hvala Bogu.
n
Što se tiče samog programa, izgleda da je super složen i teško ga je pratiti, ali nije. Zapravo je vrlo jednostavno. Polovica toga prepisuje brojeve. Druga polovica se dijeli između 16-bitne matematike, uvjetnih skokova i još više kopiranja brojeva. Dopustite mi da prođem kroz to i da vam kažem kako to radi.
n
Inicijalizacija samo postavlja neke vrijednosti registra koje program koristi. Programska petlja je malo složenija, ali ne puno. Prvo prihvaća ulaz u A registar na portu 00. Zatim se E registar zapisuje u memoriju. U prve dvije petlje, E registar sadrži neželjene podatke, pa ga pokušavamo zapisati u zadnja dva bajta ROM prostora jer se on zapravo neće zapisati; tada se pokazivač adrese (IY) povećava. Vrijednost pohranjena u D se zatim premješta u E da bi se zatim upisala. A se zatim učitava u D i L, a E kopira u H. HL je mjesto gdje se uspoređuje vrijednost oduzimanjem i provjerom ZF (nulta zastavica). Prva vrijednost u usporedbi s pohranjena je u registre B i C. B i C se tretiraju kao jedan 16-bitni registar, BC. Ako su vrijednosti iste, program skače ravno u RAM prostor, gdje se pretpostavlja da se nalazi korisnički kod. Ako se kôd u BC -u ne podudara, tada se HL ponovno učitava početnim vrijednostima iz D i E te se ponovno uspoređuje s vrijednošću u SP -u na isti način na koji je uspoređen s BC. Ako se podudara, ima isti rezultat, ali tri dodatna bajta se zapisuju u memoriju. Bajtovi su kôd koji uzrokuje skok CPU -a na sam početak programa (resetiranje softvera). Međutim, ako se druga usporedba ne podudara, program se ponavlja tamo gdje od korisnika dohvati vrijednost.
n
LD SP, EDBFH; exe kod (dodaje skok)
n
LD IY, FFEH; početni pokazivač memorije za pohranu koda
n
LD BC, EDC3H; exe kod (bez petlje)
n
petlja; asemblerska direktiva pa ne moramo znati gdje se u memoriji nalazi ovaj dio
n
U A, (00H); dobiti podatke o programu
n
LD (IY+00H), E; E sadrži kôd za pohranu
n
INC IY; pomaknite se na sljedeće memorijsko mjesto
n
LD E, D; ld D u E
n
LD D, A; ld A u D
n
LD H, E; ld E u H
n
LD L, D; ld D u L
n
ILI A; resetirati zastavu za nošenje
n
SBC HL, BC; vraća 0 ako je unet exe kod 2
n
JP Z, 1000H; ako je tako, skočite na i izvršite program
n
LD H, E; u protivnom ih osvježite na odgovarajuće vrijednosti
n
LD L, D
n
ILI A; prvi oduzimanje je možda postavilo zastavu za nošenje. Očisti to
n
SBC HL, SP; vraća 0 ako je unesen exe kod 1
n
JP NZ, petlja; ako ne, ponovite postupak (počevši od dobivanja vrijednosti)
n
LD (IY+00H), C3H; u protivnom unesite kod za preskakanje na kraju korisničkog programa
n
LD (IY+01H), 00H; jump u osnovi djeluje kao resetiranje softvera
n
LD (IY+02H), 00H; to je potpuno resetiranje u slučaju izmjene registra
n
JP 1000H; skočite i izvršite korisnički program
Preporučeni:
Z80 MBC2 - Ponovno sastavite QP/M Bios i Loader: 6 koraka
Z80 MBC2 - Ponovno sastavite QP/M Bios i Loader: Ako se, poput mene, nađete u poziciji u kojoj morate ponovno sastaviti QP/M bios za svoj MBC2 - onda to činite. Dokumentirao sam postupak ponovnog sastavljanja postojeće verzije. Na vama je da promijenite stvarni Bios
Z80-mbc2 Z80 Šifra korisničke LED bljeskalice: 3 koraka
Z80-mbc2 Z80 kodna bljeskalica LED korisnika: Ovo je primjer korisničkog LED programa napisanog u asembleru Z80 za računalo z80-mbc2. Ovo sam za sebe napravio test i reviziju, ovo je moj prvi program Z80 za više od 35 godina. Uživajte
Z80 MBC2 - Ponovno sastavite CPM2.2 Bios: 4 koraka
Z80 MBC2 - Ponovno sastavite CPM2.2 Bios: Ako se, poput mene, nađete u poziciji u kojoj morate ponovno sastaviti CP/M bios (2.2) za svoj MBC2 - onda to radite na ovaj način. u mom slučaju htio sam ukloniti poruku "WARM BOOT" svaki put kad je postojao program ili kad ste učinili ctrl-c. Ja a
Ponovno lakirajte i rashladite prijenosno računalo vodom: 17 koraka
Prefarbajte i rashladite prijenosno računalo vodom: Siguran sam da mnogi od vas imaju prijenosnik star šest ili sedam godina koji skuplja prašinu. Ali zašto biste ga pustili da stoji tamo kad biste ga mogli pretvoriti u najhladnije (bez namjere igre) prijenosno računalo u bloku? Tijekom ovog vodiča naučit ćete kako slikati svoj stari laptop
Isključite, ponovno pokrenite ili hibernirajte računalo prema rasporedu: 6 koraka
Isključivanje, ponovno pokretanje ili hibernacija računala na rasporedu: U ovom uputstvu pokazat ću vam kako isključiti, ponovno pokrenuti ili hibernirati računalo prema rasporedu. Pogledajte obavijest na kraju ako koristite stariji operativni sustav nego Windows XP