mandag 5. juni 2017

RC6502 Montering og feilsøking

Dette er et innlegg relatert til RC6502, mitt forsøk på å bygge en fungerende replika av den første Apple maskinen som ble laget. Det som trengs av tegninger og programvare for bruk av maskinvaren er lagt ut på https://github.com/tebl/RC6502.

Montering

Da var det store øyeblikket kommet, PCB-ene er her og da er alt som gjenstår å brette opp ermene, skru på loddebolten og glede seg til å se hvordan maskinen yter. Ytelse er selvsagt begrenset, men det skal bli morsomt å se hvordan det blir å arbeide med en maskin som i utgangspunktet har en hastighet på 1 Mhz. Laptop-en min har en hastighet på 2.3 millioner ganger dette, men har liten tro på at den er like morsom i bruk som denne!


Bildene over viser henholdsvis PCB-ene slik de ble levert, fulgt av et bilde av maskinen der alt et loddet sammen og montert opp. Alt ser pent og flott ut, så da er det på tide å få på plass programvaresiden av prosjektet - det vil si koden som skal kjøre på Arduino Nano-enheten man ser montert på Seriell IO-modulen bakerst.

Gitt at jeg hadde store mengder logikk innenfor 74 LS-serien liggende i en skuff så tenkte jeg det kunne være greit å få brukt opp noen av disse. Strengt tatt så skal man selvsagt ikke bruke disse for nyere design siden de bruker langt mer strøm og skal visstnok være vanskelige å få til å fungere stabilt når man passerer 5-6 Mhz, men de koster en tiendedel og så virker det tilnærmet tidsriktig.

Prosessoren jeg har brukt er en Unicorn Microelectronics UM6502 - finnes langt nyere varianter, men betalte knapp femtilappen for fem av disse. Dessuten, enhjørning! RAM benyttet er standard HM62256 av en eller annen type, disse var knappe femmeren per stykk og fortsatt raskere enn det jeg trengte. Designet ROM for AT28C256B, så det var denne jeg brukte - innholdet skrevet til brikken finnes på github-repositoriet mitt (den du vil ha er den sier 8K, den andre var bare for å slippe mental omregning av adresser).



Første livstegn

En kraftig fordel, om ikke jeg egenhendig skal kalle det en genistrek fra min egen side, når det kommer til design av maskinvare er å begrense områdene der man kan få feil - spesielt på nybegynner-prosjekter slik som dette. Det vil si, at ved å ta utgangspunkt i en eksisterende maskin slik som Apple 1 så kan jeg konsentrere meg om å få maskinvaren til å fungere mens programvaren som kjører på maskinen i seg selv allerede er kjent og verifisert fungerende.

Tilbake til Arduino-koden. I og med at Apple 1 hadde et svært simplistisk oppsett der alt av data som skulle ut til skjerm gikk Port A på PIA-kontrolleren, keyboard var koblet opp via Port B, så skulle det være relativt enkelt å skrive litt kode som flytter tegn inn og ut av maskinen. Skissen under viser hvordan alt dette henger sammen, her har jeg brukt en MCP23S17-brikke for å utvide mengden IO-tilgjengelig for Nano-en.


I dag er vi vant til at et enkelt tegn må uttrykkes ved med alt fra 8 til 32 bit for å uttrykke alle verdens tegn, men på den tiden var 7-bit ASCII som ble brukt og dermed hadde man en til overs uten at dette hadde noen innvirkning på maskinen. Denne siste linjen tok Steve Wozniak i bruk for å indikere til de ulike komponentene hvorvidt man hadde data som skulle henholdsvis leses inn (fra tastatur) eventuelt hvorvidt "skjermkortet" var opptatt med å vise data allerede mottatt.

Uansett, tiden for å koble til strømmen var kommet. Kobler til strømmen, og absolutt ingenting skjer!

Strengt tatt så skulle det ikke skje noe i den positive retningen siden koden for å kommunisere enda ikke var skrevet (den ferdige koden ligger nå på github). På dette stadiet er man bare glad så lenge ingenting freser og kaster røyk i ansiktet ditt, dermed må alt så langt kunne regnes som en suksess.

Med mye frem og tilbake for å skrive koden, inkludert å grille en PIA-brikke siden jeg brukte feil innstillinger på Nano-en brøkdelen av et sekund (fint for meg at jeg kun fikk kjøpt dem i en 10-pakning), så fikk jeg endelig en enkelt '\' ut av den. For de som ikke kjenner forhistorien til Apple 1, så betyr dette at Woz-monitor programvaren kjører og jeg kan kommunisere med den!

Kortvarig glede

Glad og lykkelig over at den svarer, noe som dermed betyr at en måneds ettermiddager på tegninger, studering av manualer og en håndfull hundrelapper for å få PCB-ene produsert ikke har vært bortkastet! Sett bort fra...

At det er det eneste tegnet jeg får ut fra maskinen hver gang den resettes, klarer ikke å sende den noe og uansett hva jeg gjør så får jeg ingen annen respons - og ikke alltid at jeg får det heller! Noen ganger får jeg ingenting innen jeg napper ut strømmen og setter den i igjen.

Etter en uke med feilsøking, det vil si å tilfeldig endre på ting for å se om det gjør noen forskjell (det var her jeg svidde den ene PIA-brikken), så er det bare å krype til korset. Jeg trenger hjelp, men tror ikke Jesus har spesielt mye input på design av Apple-maskiner så da var det eneste som gjensto å lete etter et forum med likesinnede eksentriske sjeler med en fascinasjon for sære ting. Endte opp med å få mye hjelp fra gutta på forum.6502.org.

Det de hjalp meg med er å få gått gjennom de ulike linjene som finnes på prosessoren og så benytte meg av et enkelt Oscilloskop (DSO-138, byggesett kjøpt fra Kina det også) jeg hadde liggende for å se på hvorvidt maskinen hadde en regelmessig puls. Vi kan se at klokkelinjen oscillerer stabilt, den forskjøvne klokkelinjen Phi 2 ser normalt ut samt at RDY-signalet gjør noe lignende.


Så hva forteller alt dette meg? Svært lite, utover at tilsynelatende så fungerer alt slik det skal.

Desperate handlinger

Etter å nå ha med dette i snart en uke, så er det på tide å gjøre noe desperat. Første forsøk var å designe et kort som ved hjelp av noen MC14495P1-brikker i kombinasjon med noen 7-segment display (brikkene oversetter fra binært til hex) for å i realtime vise hva som foregår på databussen, og det viste seg å være en relativt teit ide (mulig jeg plukker den opp igjen på et senere tidspunkt). Grunnen til dette er at det fortsatt er snakk om 1 Mhz, noe som da vil si at informasjonen jeg ser på potensielt sett kan endre seg noen hundre tusen ganger i sekundet - alt man da ser er bare en smørje av hva som foregår.

Andre forsøk var å programmere en Arduino Uno til å gjøre dette for meg, men kun skrive ut adressene til en loggfil hver gang den endrer seg og med en filtrering på sånn omtrent hvilken enhet det er som "prater". Det jeg fant ut av dette var at tilsynelatende så ser jeg nesten data tilsvarende '\'-tegnet, det var alltid en eller annen feil i bitmønstret og etter en stund så gikk alt til helvete... Det vil si at alt som ble skrevet ut så ut som tilfeldig crap, inkludert forsøk på å skrive til ROM og gudene må vite hva!

Natten etter våkner jeg av et mareritt der jeg er fulgt av tilfeldig data uten mål og mening, men en snill kjempe sa noe om at det var noe jeg hadde glemt! Første regel når det kommer til design av datamaskiner er å ikke la mer enn en ting snakke sammen av gangen, det betyr tilfeldig data ettersom flere snakker i munnen på hverandre - litt for ofte fulgt av rykende varme silikon-brikker, en sjelden gang fulgt av flammer!

En av de tingene jeg hadde gjort var at RAM-modulen var ment å skulle ha en NAND-gate montert, det er den vist til venstre i bildet nedenfor - denne skulle tross alt ikke være tilgjengelig ikke være nødvendig siden jeg ikke trengte funksjonaliteten, men la oss likevel prøve å montere den likevel (hadde ikke flere DIP 14 sokler, det er derfor den ser ut til å være mindre enn den skal være).


Nå sluttet alt å fungere!

Tydeligvis må det ha påvirket noe til tross for at skissen eksplisitt ikke trenger den, sjekk tegningen ovenfor til høyre - gitt at minne plassert på rett plass, det vil si i den lavere (LOW) delen av adresserommet så skal signalet ikke gå via NAND-gaten i det hele tatt!

Sjekker kontinuitet ved hjelp av multimeteret... Adresselinjen A15 skal gå direkte til CS via jumperen, og jeg får ikke et eneste pip. La meg teste hvor den går, og sånn passe tilfeldig ender jeg opp med å få et pip på jumperen som angir plasseringen av minnet (HIGH) - feilen er altså den at med alt som kunne bli koblet galt så hadde jeg egentlig koblet alt rett, jeg hadde bare skrevet feil på forsiden av PCB-en - fungerende konfigurasjon er altså den vist i bildet ovenfor til venstre, til tross for at indikasjonene på forsiden antyder at det er helt komplett galskap.

Det burde lære meg å designe ting når man er dødstrøtt og klokken er for meget, men det er en del av utfordringen og objektivt sett så har man fått gjort MYE rart underveis.

Ingen kommentarer:

Legg inn en kommentar