Siirry pääsisältöön

Nokia Mikko 1 - suomalaisen tietokonehistorian vähemmän tunnettu jalokivi

Viimeisestä kirjoituksesta on kulunut sen verran aikaa, että voisi olla paikallaan kaivella Nokian tietokonehistoriaa lisää. Viimekertaisena aiheena oli Nokia Mikko 3, mutta nyt mennään vielä kauemmas suomalaisen tietokoneen juurille, siihen ihan ensimmäiseen Mikkoon. Blogisti kun on saanut tämän lähes myyttisen Mikko 1:n käsiinsä!



Se ensimmäinen Mikko

Mikko 1 on ensimmäinen Nokian valmistama tietokone sekä ensimmäinen sarjavalmistettu ja kaupallista menestystä nauttinut suomalainen tietokone. Mikkoa ei koskaan myyty (yleis)tietokoneena, vaan se toimi kassakoneiden, tiedonkeräysjärjestelmien, pankki- ja kirjoitinpäätteiden aivoina. Löysipä Mikko 1 myös tiensä taideteokseenkin. Harmillisesti Mikko 1:n tunnettavuus ja merkitys on jäänyt jokseenkin vähäiselle huomiolle, vaikka allekirjoittaneen mielestä tämä pieni peltiräkki on ehkäpä merkittävin suomalainen tietokone ikinä.

Yksi Mikon käyttökohteista, Nokia NOP30 kirjoitinpääte.

Nokialla työskennellyt Erkki Rajulinin loi Mikon 1971-1972 korvaamaan Nokian tiedonkeräysjärjestelmissä käytettyä PDP-8:aa, joka oli liikuteltavaan laitteistoon turhan kookas. Mikosta tuli huomattavasti PDP:tä pienempi kone, kiitos juuri markkinoille tulleiden Intelin ROM- ja RAM-piirien, joita PDP-8 ei 60-lukulaisten juuriensa takia hyödyntänyt.

Toinen käyttökohde, valtion virvoitusjuomaliikkeen kassakone.

En ala tässä kirjoituksessa kertaamaan Mikon syntyhistoriaa ja sen jatkoa tarkemmin, koska Fujitsu on tehnyt ansiokasta työtä keräämällä Mikkojen ja MikroMikkojen historiaa talteen omille sivuilleen.

Sama kassakone salaisuudet paljastettuna. Mikko 1 näkyy heti näppäimistön takana.

Mikon spekseistä mainittakoon 5 Mhz kello, kolme rekisteriä, 12-bittiset data- ja osoiteväylät sekä 4 kilosanan muistiavaruus. Haiskahtaa hiukan PDP-8:lta ja Mikko 1 on siitä saanutkin aavistuksen vaikutteita. Keskustelin taannoin Erkki Rajulinin kanssa sähköpostitse ja hän kertoi PDP-8:n vaikuttaneen Mikko 1:n rakenteeseen, niitä kun Nokialla käytettiin erilaisissa järjestelmissä. Silti Mikkoa ei voi sanoa kopioksi millään asteella, se on aivan oma koneensa aivan omalla filosofialla rakennettuna. Lisäksi Mikko on mikrokoodiohjattu kone (jokainen konekielinen käsky ajaa pätkän mikrokoodia omalta muistiltaan, joka puolestaan vetelee oikeita naruja CPU:n sisällä halutun lopputuloksen saavuttamiseksi), toisin kuin PDP-8 joka luotti kovakoodattuun TTL:ään.

Mikko on omalta ajaltaan hyvin edistyksellinen kone. Siinä on käytetty ennakkoluulottomasti tuoreinta sen ajan tekniikkaa mitä aikanaan pienehkö yritys nimeltä Intel pystyi tarjoamaan.


Mistä pienet Mikot on tehty

Siinä se nyt on.

Vaikka Mikon nimi kun tulee sanoista MICro COmputer, ei Mikko kuitenkaan ole oikeastaan mikrotietokone siinä merkityksessä kuin me ymmärrämme sen nykypäivänä. Mikossa ei ole yhden piirin mikroprosessoria, vaan prosessori syntyy noin sadasta yhteen liitetystä TTL-piiristä. 

Mikko on todella minimalistinen minitietokone. Siinä ei ole lainkaan lippurekisteriä, se ei osaa tehdä bittisiirtoa oikealle, mikrokoodi ei pysty hyppimään eikä sillä ole mitään tapaa haarautua. Ainoa tapa ehdollistaa (mikro- ja ohjelma)koodia on ALUn ylivuotobitin testaus tai IO-laitteen testaus, joka aiheuttaa seuraavan mikrokoodikäskyn kahteen kertaa. Lisäksi horisontaalinen mikrokoodi, jossa on "ohjeet" 43 käskylle ja 8 keskeytykselle sekä näiden hyppyosoitetaulukot, on vain 256 sanaa (16-bit) pitkä! Miten näillä eväillä voi muka rakentaa CPU:n?

IO vasemmalla, äly ja muisti oikealla.

Aloitetaan perusjutuista. Mikko luurankona toimii metallinen räkki. Räkin taustalevyyn kiinnittyvät kortit, joista neljä muodostavat CPU:n, loput keskeytysohjaimen, muistin ja IO:n ulkomaailmaan. Taustalevyn kautta kortit kommunikoivat keskenään.

Mikon takapuolelta löytyy taustalevy, joka yhdistää kortit.

Mikossa ei ole valoja eikä kytkimiäkään kuten monissa aikansa minitietokoneissa, sitä kun ei ole suunniteltu varsinaisesti käyttäjän ohjelmoitavaksi, vaan Mikko on ollut oman aikansa mikrokontrolleri. Kuitenkin ulkopuolinen ohjelmointilaite on ollut mahdollista liittää IO-väylään ja kirjoittaa (RAM) muistiin ohjelmia. 

Mikon CPU.

CPU syntyy neljästä kortista. 3 lähes identtistä korttia muodostavat ALUn, rekisterit ja 256 sanan onboard-muistin, jokainen 4-bitin leveydeltä. Muistipiireinä käytetään Intelin toista tuotetta (olisi voinut olla ensimmäinenkin, mutta myöhästyi aivan aavistuksen 64-bittiselle RAM-piirille) vuodelta 1969, staattista RAM-piiriä tyyppinumeroltaan 1101. ALU on tehty erillisistä TTL-piireistä, monimutkaisin osa lienee 7483 kokosummain.

Näitä ohjaamassa on keskuskortti joka vetelee mikrokoodin tahdissa aiemmin mainittuna lankoja muilta korteilta. Mikrokoodi on tallennettu kahdelle Intelin maski-ROMille 1302, joka sekin hyvin varhainen Intelin tuote. Mielenkiintoista on että Nokia on päätynyt maski-ROMien, koska ne on pitänyt varta vasten teettää Intelillä, eikä pientä määrää ole taloudellisesti ollut kannattavaa tehdä.

CPU:n kortit. Kolme ensimmäistä vasemmalla ovat 4-bittisiä rekisteri&ALU-yhdistelmäkortteja, joista käytetään lyhennettä KEL Nokian dokumentaatiossa. Korteilla on yhteensä 256 sanaa muistia, jotka muodostavat samalla nollasivun. Seuraavana kontrollikortti OKL mikrokoodimuisteineen ja laitimmaisena keskeytyksistä vastaava kortti BRC.

CPU:n vieressä on keskeytysohjainkortti, joka pakottaa mikrokoodin- ja/tai ohjelmanajon haluttuun osoitteeseen. Ohjelmamuisti on puolestaan yhdellä tai kahdella kortilla muodostuen yksistä maailman ensimmäisistä EPROM piireistä, Intel 1702:sta. Jokainen piiri sisältää 256 tavua ja Mikon 12-bittisen luonteen takia osa muistipiirien sisällöstä ovat limitetty. Näiden päälle on vielä optiona 768 sanan RAM-lisämuistikortti.


Yksinkertaisuus kunniaan

Mikon kaikki sisukset blogistin näkemyksenä. Joitain taiteellisia vapauksia on otettu signaalien nimien suhteen. Alueet on rajattu korttien mukaan.

Kuten moni aikalaisensa, Mikon CPU sisältää vain kolme rekisteriä

CR (Command Register) - käskyrekisteri joka pitää sisällään käskyn ja/ tai osoitteen. Rekisterin sisältöä käytetään oikean mikrokoodialiohjelman osoitteen hakuun, kun mikrokoodissa osuu E00-bitti ( = lue uusi käsky) kohdalle. CR:n 9 alinta bittiä ovat mahdollista ohjata osoiteväylään, joten käskyn koodi voi sisältää osoitteen muistin nollasivulle. Myös IO-väylän laite-, suunta- ja funktiokoodi saadaan tarvittaessa CR:ltä. CR:ää ei voi ohjata summaimelle.

AC (Accumulator) - yleisrekisteri, joka toimii pääsääntöisesti ALUn tekijä- ja tulosrekisterinä. AC:n saadaan tarvittaessa negatiivisena summaimelle. Kaikki AC:n bitit voidaan ohjata myös osoiteväylään. Lisäksi AND-operaatio voidaan tehdä AC:n ja muistin välillä.

PC (Program Counter) - ohjelmalaskurirekisteri. Kaikki PC:n bitit voidaan ohjata summaimelle osoiteväylän lisäksi.


KEL-kortti, joita Mikossa on 3 kappaletta pienin variaatioin. Jokainen kortti vastaa rekistereistä ja matemaattisista operaatioista 4 bitin osalta. 

Mikossa ei ole varsinaista ALU (Arithmetic and Logic Unit) -piiriä, vaan pelkästään (3x) 4-bittinen TTL-piiri 7483, joka toimii kokosummaimena. Tämän kaverina on sitten NOR-portti, joka käänteisten rekisterilähtöjen takia toimii AND-operaation AC-rekisterin ja muistin välillä. Summaimen toinen tekijä saadaan rekistereistä ja toinen muistista tai kiinteistä 0 ja 4095 arvoista. Nämä vähäiset osat muodostavat ALUn ja järjestely on todella yksinkertainen. ALU siis osaa ainoastaan laskea yhteen, suorittaa negaation (ja sitä kautta vähennyslaskun) ja AND-operaation. Siinä kaikki ja muuta ei tarvitakaan.


Ferriittirengasmuistin orastava kuolema

Rekistereiden lisäksi tietysti Mikossa on muistia, vakiona 256 12-bittistä sanaa RAMia, 256 kilosanaa ROMia (maksimi 1024 sanaa RAM / 3072 sanaa ROM). Muistiavaruus on levitetty hieman erikoisesti, mutta ihan syystä.

Ohjelma pysyy tallessa Intelin 1702 EPROMeilla. Näitä piirejä ei tule sotkea mikrokoodin sisällään pitäviin maski-ROMeihin, vaikka etäisesti samannäköisiä ovatkin.

Koska Mikossa ei ole mitään virallista pinoa tai mekanismia sille, pitää aliohjelmien pointterit ja paluupisteet sekä mikrokoodin väliaikaisdata saada jonnekin talteen. Kätevin paikka on nollasivu, jolloin ohjelmamuistina toimiva ROM (Read Only Memory) on oltava jossain muualla, tässä tapauksessa ykkössivulla ja lisä-RAM sitten aivan muistiavaruuden huipulla.

Mikon muistimappi.

Joitain muistipaikkoja on varattu tiettyihin tarkoituksiin. Mikrokoodi käyttää näitä väliaikaistallentamiseen, kun se tarvitsee jonkin rekisteriä omiin touhuihinsa

0000 AC
0001 PC
0002 PC+1 kun BRC-keskeytys osuu kohdalle

Sitten on vielä pointtereita:

0004-0015 (okt. 04-17) pointteriryhmä 1
0016-0031 (okt. 20-37) pointteriryhmä 2
0240-0255 (okt. 360-377) aliohjelmien paluuosoitteet
0480-0495 (okt. 740-757) aliohjelmien osoitteet 1
0496-0511 (okt. 760-777) aliohjelmien osoitteet 2

Pointterien paikat saattavat vaikuttaa mielivaltaisilta, mutta näille paikoille on syynsä. Käskyrekisterin CR:n 9 alinta bittiä kun voidaan tuoda osoiteväylään, syntyy konekäsky binäärikoodien kautta suoraan oikotie pointtereihin. Esimerkiksi JMSI (paluu alirutiinista) käskyn koodi oktaalilukuna on 636X (jossa X määrittää pointterin) ja paluupointterit alkavat osoitteesta 360 eteenpäin, tulee osoite pointterille käskyn osuessa automaattisesti.

768 sanan lisämuisti. Piirit Intelin 1101:sia, kuten CPU:n sisäisessä muistissa. Ilmeisesti muistipiirit ovat olleet kulutustavaraa, kolmea eri variaatiota on levylle vuosien varrella juotettu.

Muistin koko kuulostaa takuulla lukijalle täydeltä vitsiltä, mutta itseasiassa se on varmasti tarpeeksi tämän kaltaisille sovelluksille. Ja vaikka piirit ovat tuohon aikaan olleet huvittavan kokoisia (esim. gigatavuun tarvisi 32 miljoonaa Intel 1101 -piiriä) olivat ne merkki muistien murroksesta joka vääjäämättömästi lähestyi.


4096 bittiä pitkä sielu

Mikko saa sielunsa kontrollikortilta. Kellotaajuus 5Mhz voi kuulostaa kovalta aikalaisekseen, mutta käytännössä kellotaajuus ei realisoidu räjähtävänä suorituskykynä, koska yksi mikrokäsky ottaa aikaa aina 10 kellojaksoa. Teoriassa tämä tarkoittaa 500 000 mikrokäskyä sekunnissa, mutta normaalin konekäskyn mikrokoodiosoitteen haku ottaa päälle 4 kellojaksoa, toisin sanoen 0,8 μs. Jokaisen käskyn mikrokoodialiohjelman lopussa luetaan seuraava käsky muistista käskyrekisteriin (CR), joka ottaa puolestaan aikaa 4 μs. 


Kontrollikortti joka pistää Mikon eloon. Kaksi isoa keraamista lutikkaa ovat mikrokoodin sisällään pitävät Intel 1302 ROM-piirit.

Kontrollikortilla on mikrokoodi-ROMit ja mikrokoodin purkuun liittyvä logiikka sekä koneen tahdistus. Mikrokoodi on todella kapea, vain 16-bittiä ja sen lisäksi vieläpä uskomattoman lyhyt: 256 askelmaa eli 4096 bittiä. Tosin tämä tila on käytetty todella tarkkaan, vain yksi sana on muistista käyttämättä.

Mikrokoodin toinen maski-ROMeista aukaistuna. Koska sisältö on "poltettuna" piirissä, näkee bitit näkee jopa paljaalla silmällä.

Nämä 16-bittiä ohjaavat mistä vaikkapa osoiteväylä tai ALU saavat lähteensä tai mikä rekisteri ladataan. Erikoisuutena mikrokoodissa on käskyjen hyppytaulukon yhdistäminen samaan muistiin itse mikrokoodin kanssa. Normaalisti on käytetään erillistä ROM-piiriä, jolla käskylle saadaan mikrokoodimuistin osoite, josta käskyä vastaava mikrokoodiohjelma alkaa. Mikossa homma toimii siten, että kun mikrokoodissa E00-bitti (loppu, hae uusi käsky) nousee ylös, siirretään CR:n tietyt bitit tietyillä ehdoilla suoraan ensimmäisen mikrokoodi-ROMin osoitelinjoihin ja sen jälkeen siirretään kyseisen muistipaikan sisältö mikrokoodin osoitelaskuriin.

Mikrokoodin bitit. E1:n bitit toimivat myös hyppyosoitteena käskylle tai keskeytykselle.

Itse mikrokoodi rullaa laskurin avustamana eteenpäin. Joka kymmenes kellojakso mikrokoodiosoitelaskuria kasvatetaan yhdellä, mikäli kyseessä ei ole käskyn nouto, keskeytystilanne tai ylivuototilanteen testaus (tai IO-laitteen skip) ja PR:n luku. Jälkimmäinen tilanne on se ainoa tapa ehdollistaa ohjelmaa Mikossa. Alkuun saattaa kuulostaa oudolta, mutta otetaanpa esimerkki. 

Mikon käskykanta.

Kuten tyypillistä omalle ajalleen, kaikki Mikon haarautumiskäskyt ovat "Skip if.."-tyylisiä, eli käsky hyppää yhden konekielisen ohjelmarivin yli jos käskyn määrittämä ehto toteutuu. Esimerkiksi käsky "Skip if AC = 0", eli hyppää käsky yli jos akku on yhtä suuri kuin nolla, tapahtuu seuraavasti: AC = /AC + 1 & Test OFL (koska vaikkapa binäärinä 1000 + 1 = 1001, mutta nollan negaatio 1111 + 1 = 1 1111 = ylivuoto). Jos ylivuoto tapahtuu on AC nolla, ja mikrokoodirivi joka normaalisti kasvattaa PR:ää yhdellä seuraavaa käskyä varten saakin yhden kierroksen kasvatuksen lisää, jolloin yksi käsky hypätään yli.

Blogistin purkamaa mikrokoodia. Ylhäällä näkyy käskyjen hyppyosoitteita, punaisella pohjailla olevat ovat keskeytyksien osoitteita. Aivan ylimmällä rivillä on käskyn JMAI mikrokoodia, käsky hyppää osoitteeseen joka on tallennettu AC-rekisteriin (PR = AC, CR = PR:n osoittaman muistipaikan sisältö ja END). Keskellä näkyy puolestaan kolmen eri käskyn mikrokoodia, R3L, R2L, R1L. Toisin sanoen "vieritä akkua vasemmalla n kertaa". Vieritysten määrä (3-1) riippuu mistä kohtaa tullaan ohjelmaan sisään. Vieritys itsessään tapahtuu summaamalla AC itseensä.

Käskykanta on aavistuksen erikoinen nykyihmisen silmään. Mikossa ei oikeastaan ole mitään osoitusmuotoja, vaan jokainen käsky käyttäytyy ja osoittaa sinne minne se haluaa. Käskyt ovat myös aika omituisia, kuten "Kerro viidellä" tai "Kerro kymmenellä". Sitten on käskyjä, mitkä ei  nopeasti ajateltuna pitäisi edes toimia, kuten "Siirrä muistialue näytölle/kirjoittimelle", koska mikrokoodi ei voi hyppiä itsensä sisällä. Mutta aiheen monimutkaisuuden takia palaan näihin mikrokoodikäskyihin seuraavassa osassa, en edes yritä selittää vielä tämän postauksen raameissa kaikkea.

"Mahdoton" käsky MOTN/MOTK, joka siirtää muistialueen näytölle tai kirjoittimelle. Siirrettävän muistialueen alkuosoite on AC:ssa, poistuminen seuraavassa muistipaikassa hypyllä, alueen loppuosoite PR+2 ja laitteen pitää antaa aina SKIP. Arvaatko miten käsky pystyy siirtämään muistialueen?

Mikrokoodi pyörii kokoajan Mikossa, vaikka Mikko ei tekisi mitään, koska mikrokoodi hoitaa aivan kaiken. Jos ulkoiselta ohjelmointilaitteelta halutaan kirjoittaa muistiin, aiheuttaa se keskeytyksen, joka laittaa mikrokoodin hakemaan tallennettavan saman IO-väylään liitetyltä ohjelmointilaitteelta ja siirtää sen haluttuun muistipaikkaan. Samoin vaikkapa ohjelmointilaitteelta STOPin painaminen aiheuttaa keskeytyksen, joka laittaa mikrokoodin NOP-loopiin, tai tarkalleen ottaen JMP+0 -loopiin, seuraava keskeytys ajaa sen ulos limbostaan.


IO-laitteet

Mikon pitää pystyä kommunikoimaan ulkomaailman kanssa, vaikkapa kirjoittimen ja näppäimistön kanssa. IO-laitteita varten on jokaiselle oma laitekorttinsa, joka tarttuu räkin taustalevyssä olevaan IO-väylään. IO-väylä sisältää muutaman ajoitussignaalin, skip-signaalin, laitekoodin (5 bittiä), laitefunktiokoodin (4 bittiä) ja sekä tietysti kaksisuuntaisen 12-bittisen dataväylän. 

Sarjaliikenteestä vastaava laitekortti. 

Jokaisella laitekortilla on oma laitekoodinsa, jonka se tunnistaa väylästä, jos Mikon CPU sitä huutaa. Laitefunktiokoodi puolestaan kertoo laitteelle, mitä sen pitäisi tehdä. Nämä kummatkin koodit tulevat suoraan käskyrekisteristä (CR), koska konekielisiin IO-käskyihin (DIT ja DOT) sisällytetään laitekoodi ja laitefunktio.

DIT- ja DOT-käskyjen rakenne.

Laitetta voi myös testata, esimerkiksi näppäimistöä voidaan testata onko siellä uutta merkkiä odottamassa. Tämä tapahtuu samalla "Skip if.."-rakenteella kuin ohjelman ehdollistaminen, nyt ei ylivuoto aiheuta ohjelmalaskurin (PR) kasvamista yhdellä, vaan laiteen tila. Tämän takia IO-väylä sisältää oman Skip-signaalin.


Keskeytykset

Tietokonehan ei ole tietokone ilman keskeytyksiä ja Mikko osaa niitä peräti 8. Tosin 7 keskeytyksistä on ulkopuolista ohjelmointilaitetta varten, näillä keskeytyksillä siirretään dataa ohjelmointilaitteen ja Mikon välillä. 

Keskeytysohjainkortti aka BRC.

Keskeytykset toimivat mikrokoodin kautta. Keskeytyskortti kun saa signaalin keskeytystä vaativalta taholta, odottaa se senhetkisen käskyn mikrokoodiohjelman suorituksen loppuun ja sen jälkeen pakottaa mikrokoodiosoite-MUXin kautta mikrokoodin hyppäämään keskeytystä vastaavaan mikrokoodialiohjelmaan. Nämä ohjelmat ottavat ensin talteen rekisterit muistin alkuun ja sen jälkeen tekevät tarvittavat temppunsa. 

Kahdeksas keskeytys, BRC, on laitteen käynnistämistä ja resetointia varten. Tämä keskeytys tulee automaattisesti, kun Mikko saa ensimmäisen kerran virtaa. Keskeytys käynnistää mikrokoodiohjelman, joka ohjaa EA-väylässä (External Address) olevan arvon muistin osoitteeksi. Muistipaikan sisältö on itse muistiosoite (siis epäsuora muistinosoitus), josta ohjelma käynnistetään. EA-väylän osoite on kiinteästi langoitettu keskeytyslevylle ja vakiona se on oktaalina 677.


Blogistin Mikot

Ensimmäinen Mikko 1 löytyi Suomen Tietojenkäsittelymuseolta sekalaisten osien laatikosta ja myöhemmin sain myös kokonaisen NOP30:nen lahjoituksena. NOP30 on älykäs kirjoitinpääte, jonka tietoliikennettä hoitaa Mikko 1. Kirjoitettua tekstiä voidaan tallennetaan nauhalle ja tulostaa sitä sitten paperille. NOP30:tä voi kommunikoida modeemin yli keskuskoneelle. NOP30 oli mm. käytössä 70-80-luvulla VR:n lipunmyynnissä, omalla kustomoidulla softallaan.

Nokia NOP30. Nokiaa ei sinänsä laitteessa ole kuin rekvisiitan osalta, itse kirjoitinosa on Diablon valmistetta.


Mikko 1 on kätketty NOPin jalkaan.

Tietysti kun sai tällaisia aarteita käsiin, oli ne pakko pistää osiksi. Ensimmäinen vaihe oli valokuvata kortit, piirtää Photoshopissa johtimet ja arvailla mitä korteilla tapahtuu. Hyvin nopeasti sai perusrakenteen selville ja jonkinlaisen käsityksen koneen toiminnasta.

Kasettilamereiden Tommi taas kerran jeesasi ja mikrokoodi-ROMit kuvattiin mikroskoopin alla ja kuvien perusteella saatiin kaivettua mikrokoodin sisältö. Tommi myös selvitti yli-inhimillisellä nopeudella miten bitit sijoittuvat piirin matriisissa. Nyt kun oli mikrokoodi digitaalisessa muodossa, sain sen purettua Excelissä makrojen avulla ihmisen ymmärtämään muotoon.

Toinen Mikon mikrokoodi-ROMeista (Intel 1302). Ihmisen kädenjäljet ovat nähtävissä lankojen hitsauksissa, osa langoista ei ole ensimmäisellä kerralla jääneet kiinni piirin padiin. 

Lähikuvaa muistisoluista. Löytyisiköhän Inteliltä vielä tuo 0452-maski?

Kun selvitystyö oli kiivaimmillaan, sattui naapuripitäjästä löytymään entinen nokialainen huoltomies, joka lahjoitti Mikko 1:een liittyvää materiaalia, mm. huoltomanuaalin. Kytkentäkuvat olivat kirjoissa  valokopionvalokopioita, mikrokoodilistauksia ei ollut ja toiminnan kuvauksessa oli virheitä, mutta nämä kirjat nopeuttivat projektia aivan uskomattoman paljon, koska enää ei tarvinnut arvailla ihan niin paljon. Herkkuna pohjalla löytyi vielä ohjelmalistaukset NOP30:nen eri malleille oktaalilukuina. Mikään OCR jostain syystä ei pystynyt tulkkaamaan tulosteita, joten näpytin ne käsin koneelle ja tein ohjelman, joka käänsi oktaalit binääriksi ja varmisti tarkitussumman perusteella näpyttelyt oikeiksi.

OS03-ROMien listauksia. Nokian kirjoitin on saanut jonkun sortin kohtauksen kesken listauksen tulostuksen, joka sitten aiheuttaa digitaaliarkeologille päänvaivaa puoli vuosisataa myöhemmin. Onko rivi 7664 0534.., 7664 5344.. vai jotain muuta? Nokian huoltomanuaaleista löytyivät ROMeille tarkistussummat, joiden perusteella löysin oikean kombon.

Jälkeenpäin tein prommeriini adapterin 1302/1702-piireille. Kivikautisia PMOSeja kun ei lueta nykyisillä prommerilla, piirissä käyttöjännitteet -9V/+5V. Tällä itsetehdyllä adapterilla otin dumpit mikrokoodi-ROM-piireistä ja varmistin Tommin tutkimusten  perusteella oikeiksi. Pieni kämmi oli vain käynyt kansia aukaistessa: yksi hiustakin ohuempi lanka oli lähtenyt jalan ja piipalan väliltä pois. Sain tämäkin ongelman selätettyä nuppineulalla, jota pidin kädellä piipalan padin ja oletetun langan kohdalla ja ottamalla toistuvia kopioita piiristä prommerilla. Lopulta kun sain kaksi samanlaista kopioita, oli homma tehty. Jos joku tietää paikkaa missä tuon langan voisi hitsata takaisin, saa antaa vinkkejä.

Käänteismallinnusta suorittaessa tuli huomattua ettei Mikossa ole yhtäkään muistipiiriä, jossa ei olisi sotkettu osoite- tai datalinjoja sikin sokin. Syy on yksinkertainen ja se on yksinkertaisempi johdotus. Sotkettu jalkajärjestys piti ottaa huomioon luonnollisesti ROM-piirejä dumpatessa.


Emulointi á la C#

MikkoEmu.

Tietysti kun Mikon sielunelämä alkoi olla selvillä, oli myös pakko tehdä emulaatio koneesta. Looginen valinta oli C#, koska en nähnyt mitään arvoa tehdä emulaattoria konsolipohjaisena. Se olisi useimmille aivan liian vaikeaselkoinen ja turhan konstikas käyttää.

Itsessään emulaatio CPU:n osalta toimi päivässä, sen kun noudatti logiikan sääntöjä ja lisäsi mikrokoodi-ROMit ohjelmaan ja käsin näpytellyt ohjelmalistaukset. Mutta IO, sen graafinen toteutus ja muu rekvisiitta ottikin aikaa ja tulee vielä ottamaan lisää.


Kaikki mahdollinen on emulaattorissa visualisoitu jollain tapaa.

Emulaatiossa IO-laitteet ovat itsenäisiä omine viiveineen, CPU juoksee omaan 5Mhz tahtiin taustalla. Emulaatio visualisoi koko CPU:n toiminnan lohkokaavioon, ohjelmointilaitetta voi käyttää, Diablo-kirjoitin on emuloitu viiveineen, suoritettavan mikrokoodirivin näkee ja itseasiassa näkee myös muistin kaikki 49 140 bittiäkin reaaliaikaisesti. Koko emulaatio tapahtuu kellojaksotarkasti, jokainen signaali tulkitaan oikealla hetkellä kuten oikeassa. 

Vielä on matkaan maaliin, nauha-asemaemulaatio ja assembleri puuttuvat, mutta toivotaan että ehdin saattamaan emulaattorin loppuun kevään mittaan...ja sitten ehkä saatamme nähdä FPGA/CPLD-version Mikko 1:stä.


Loppuun vielä...

Mikko 1 on todella hieno tietokone, joka todistaa että kyllä 70-luvun Suomessa osattiin tehdä muutakin kuin sellua. Mikko on myös varmaankin yksi maailman minimalistisimmista koneista, vaikka se ei ihan ultimaattista RISC-henkeä mikrokoodipohjaisena tavoitakaan.


Mikko 1 verrattuna Nixdorf 820 keskusyksikköön. Molemmat koneet ovat spekseiltään aika samanlaisia ja ovat samaan aikaan olleet tuotannossa.   



Tekniikan tason ero on aivan uskomaton koneiden välillä. Nixdorf käyttää ferriittirengasmuistia, induktiivista ROM-muistia, TTL:ää, DTL:ää ja erillistransistoreja sekaisin. Tästä muutama vuosi eteenpäin ja sama kokoero oli Mikon ja mikroprosessorien välillä.

Jotenkin olisin melkein toivonut, että Mikko 1 olisi ollutkin vain paranneltu PDP-8, funktionaalisuus kun ei kauas jää kaukaisesta esikuvastaan... Vähän lisää osia ja käytännössä Mikko 1 olisi ollut enemmän kuin PDP-8. Mutta ainakin Mikko 1 tuli oikeaan aikaan. Paljon aikaisemmin se ei olisi voinut tulla, koska ei ollut teknologiaa ja myöhemmin tullessaan mikroprosessorit olisivat laittaneet Mikon kylmäksi mitään kyselemättä. Suhteellisen vaatimattoman tehoiselle koneelle ei olisi ollut kysyntää tai taloudellista järkeä enää mikroprosessorien marssiessa areenalle 70-luvun puolivälin jälkeen.

Pienenä sivuhuomautuksena kerrottakoon, että samanlainen Diabloon perustuva kirjoitinpääte kuin NOP30 veivattiin Data Terminal Corporationin toimesta markkinoille, mutta Intelin 4004 mikroprosessoriin perustuvana. En lähde arvailemaan kumpi lähestymistapa oli parempi, mutta ainakin se oli jo esimakua tulevasta mikroprosessorien maailmanvalloituksesta.

Koko postauksesta joku voisi ajatella ettei Mikko 1 vastaa edes alkeellisinta taskulaskinta. Mutta tämä päätelmä on väärä. Vaikka Mikko onkin todella yksinkertainen kone, kykenee se silti aivan samaa kuin aikansa vastaavat tietokoneet tai mikroprosessorit. Vastaavan kaltaisia tietokoneita oli ennen ja jälkeen Mikon, kyse on ollut vain ohjelmoijan taitavuudesta. Seuraavissa osissa perehdytään Mikon ohjelmointiin ja mitä tapahtuu oikeasti konehuoneessa, kun käskyjä suoritetaan.


***

Nyt tarvittaisiin lisää Mikko 1:n dokumentaatiota, koneita, osia, ROMeja ja tietoa. Etenkin kiinnostaisi kassakoneversio (KAP1) joita oli Alkoissa 70/80-luvuilla sekä Prodigit-pääte. Kaikki tieto ja materiaali on tervetullutta.

Kiitokset kaikille ex-nokialaisille ja muille blogistia auttaneille!

***

Tässä vielä asiasta kiinnostuneille lisää materiaalia tutkittavaksi






Kommentit

  1. Hienoa tarinointia, kiitos jälleen erittäin mielenkiintoisesta lukupaketista!

    VastaaPoista
  2. Hmmm...seem to remember Intel 4004's having a similar instruction set.

    VastaaPoista
    Vastaukset
    1. I think both have got some echoes from 60s on their instruction lists. I haven't studied 4004 that much, all I know it has a really weird indirect addressing scheme.

      Mikko has very similar instruction set with the PDP-8, they are divided into two groups even with the same names:"memory reference instructions" and "micro instructions".

      However what here is funny Mikko make no difference between groups (in a hardware level), because all opcodes goes through the microcode, so basically they all are "micro" instructions. And in the PDP's case, the machine has no microcode at all, theorically there is no "micro" instructions either ;)

      Poista

Lähetä kommentti