sunnuntai 15. maaliskuuta 2015

HP1000 - Arkkitehtuuria: Mikrokoodi, ALU, rekisterit

HP:n sielunelämä on kaukana normaalista nykyajan lapsen näkökulmasta, johtuen varmaankin HP:n hippiajan juurista. Esimerkiksi kaikki dokumentaatio on esitetty oktaalilukuina, eli 3-bitin paloissa. Luulisi että heksana esittäminen olisi hiukan loogisempaa, kun kone on kuitenkin 16-bittinen.

Toinen omituisuus on rautapinon puuttuminen. Toki pinon voi tehdä mikrokoodilla muistiin ja käyttömuistissahan pino yleensä onkin, mutta koneessa ei ole mitään rautatasolla toimivaa mekanismia sille. Eikä muuten vakiokäskykannassa ole mitään push/pop-käskyjä. Samasta syystä puuttuu myös aliohjelmien paluuosoitteiden tallennuksen puuttuminen, kun ei ole sitä pinoa.

Mikrokoodille löytyy kuitenkin pino, joka onkin sen luonteesta johtuen vähän pakollinen. Lisäksi mikrokoodille on sen touhuihin varattuna 12 rekisteriä, mutta makrokoodille (siis konekoodille) ei yhtään, vain kaksi akkua, A ja B. Näillä on myös muistipaikat 0 ja 1 osoiteavaruudessa.


HP:n kaiken selittävä lohkokaavio.


Lohkokaaviosta selviää paljon. Vasemmalla puolella olevat muistiin ja sen suojaukseen liittyvät kortit ovat liitettynä koneen etupuolella olevaan räkkiin. Oikealla puolella olevat IO-kortit ja uudelleen kirjoitettava mikrokoodimuisti sijaitsevat koneen takana olevassa räkissä. Mikrokoodinlaajennus-ROMit sijaitsevat koneen alla ja näkyvät kuvassa oikeassa alareunassa.

Kiinnostavin on kuitenkin kuvassa tietysti itse CPU, joka löytyy kuvan alaosasta keskeltä. Fyysisesti CPU on yksi iso kortti koneen pohjassa.

CPU:n lohkokaavio.


Mikrokoodi


Jos hiukan tutkitaan CPU:n kaaviota, näemme oikealla mikrokooditulkin, CPU:n ulkopuolella on käskykannan laajennukset. Käytännössä mikrokooditulkki on tilakone, joka pääsee ronkkimaan vähän joka nurkkaa CPU:sta.



Punainen ALU, rekisterit ja akut. Vihreä mikrokoodin tulkkaus. Sininen S-väylä. Oranssi loader-ROMit. Kuvasta puuttuu S-väylä ja MIR-rekisterin (bit10-bit17) portti.


Mikrokoodi yksinkertaistettuna toimii seuraavasti: konekäsky saapuu käskyrekisteriin (IR), jonka 8-bittinen ylempi osa siirretään hyppy-ROMiin (jump tables). ROMmeista löytyy käskyä vastaava mikrokoodiosoite, joka siirretään CMAR (control memory address) -rekisteriin. CMAR osoittaa osoitetta mikrokoodi-ROMeilla, josta sitten 24-bittinen mikrokoodi MIR (microcode instruction register) -rekisteriin dekoodattavaksi. CMAR-rekisteri on muodostuu 74163 TTL-laskureista, joten samalla saadaan seuraavan mikrokäskyn osoite helposti.


Mikrokooditulkin kytkentäkuva.


Mikrokoodin dekoodaus.


Mikrokoodi hoitaa lähes kaiken tässä laatikossa. Se fetchaa uuden käskyn muistista, lataa loader-ROMin muistiin ja hoitaa myös etutaulun valojen ja kytkimien toiminnat. Ikävä kyllä samasta syystä valot eivät vilku suorituksen aikana etutaulussa...

Mutta ihan kaikki ei mene mikrokoodin läpi, löytyy yksi erikoisuus, joka liittyy HP:n käskykantaan. Käskykannassa on mahdollista lisätä käskyjä käskyyn. Kuulostaa omituiselta ja sitä se onkin. Normaalisti konekielessä sinulla on yksi käsky ja sille ehdot. HP:ssa joidenkin käskyjen kohdalla voidaan lisätä "mikrokäskyjä" asettamalla bittejä käskyyn. Esimerkiksi jos sinulla on käsky "hyppää jos negatiivinen", voit lisätä käskyt "käänteinen tila" ja "vieritä A" käskyn kahdella tietyllä bitillä.


Mikrokäskyt löytyvät kohdista ASG ja SRG


Mikrokäskyt dekoodataan suoraan IR-rekisteristä.


Jostain syystä mikrokäskyt ovat nimetty hullulla tavalla, koska ne eivät liity mitenkään mikrokoodiin. Oikeastaan niitä pitäisi kutsua nanokäskyiksi.


ALU & rekisterit


Kuten vähän kaikissa 70-luvun minitietokoneissa, matemaattiset ja loogiset toimitukset hoitaa legendaarinen 74181 ALU sekä 74182 look-ahead carry unit. 74181 ei kuitenkaan kykene bittien vieritykseen, joten kokonaisuuteen on lisätty 74153:sia hoitamaan rotate/shift -toiminnot.


ALUn kytkentäkuva.


Rekisteripuolella ei ole mitään ihmeellistä, 64-bitin (4x16) 74189 SRAM, mutta A&B-akkuissa on jotain erikoisempaa, porttina toimii 74198 shifteri. Tämä sen takia, että CPU voi suorittaa 32-bittisiä laskutoimituksia.


Loader ROMit


Koska tätä 211x/21MX/1000 -sarjaa ei ole koskaan tarkoitettu yhteen tehtävään, ei siinä ole vakiona mitään ROM-muistia käyttöjärjestelmälle. Käyttöjärjestelmä tai ohjelma on ladattu ulkopuolisesta laitteesta muistiin. Mutta jokin ROM tarvitaan, jotta dataa saadaan ulkopuoliselta laitteelta muistiin. Muuten ainoa vaihtoehto olisi näpyttää joka käynnistyksessä loaderi taulun nappien kautta muistiin.

HP ratkaisi laittamalla loaderit emolle, 4x256-bittiset ROM-piirit, 64 sanaa pitkät loaderit, jotka ladataan melko mystisellä tavalla muistiin mikrokoodin avustamana. Kytkennästä nähdään, että jokainen ROM on neljällä bitillä kiinni S-väylässä, josta se siirtyy muistin yläosaan. IR-rekisterin pari ylintä bittiä valitsevat halutun ROMin ja alempi 8-bittiä osoitteen. 8-bittinen osoitelaskuri on IR-rekisterin alempi puolisko, johon mikrokoodi pääsee käsiksi. Mikrokoodi sählää 4-bit palat muistiin järjestyksessä ja kasvattaa laskurinarvoa.

Samaa IR-rekisteriä/laskuria mikrokoodi voi käyttää muihinkin tarpeisiin, ei pelkästään loaderien lataamiseen (käskyrekisterillä kun ei ole mitään virkaa, kun sen tieto on kerran mennyt hyppy-ROMien läpi).


Loader ROMit näkyvät kuvassa keskellä.


Seuraavalla kerralla sitten keskeytyksistä, muistiavaruudesta ja sen sellaisesta.


Ps. Jos on pakottava tarve tutustua kytkentäkuviin ja toiminnan kuvaukseen, niin täältä löytyy: http://bitsavers.trailing-edge.com/pdf/hp/1000/1000_MEF_EngrRef/92851-90001_Mar81_1.1.pdf

keskiviikko 4. maaliskuuta 2015

HP1000 - Paperinauha-aseman emulointia

Oktaaliluku 102077, toisin sanoen "end of tape". HP:n päällä SiliconLabsin 80C51 mikrokontrolleri, joka toimittaa paperinauha-aseman virkaa.


Viikonloppuna tehtyä uusi projekti, paperinauha-aseman emulaattori, kun ei oikeaa asemaa tullut koneen mukana. Toisaalta, eipä sellaisella enää ole muuta käyttöä kuin nostalginen fiilistely, helpommalla pääsee kun laittaa nyky-PC:n matkimaan nauha-asemaa.

Emulaattorin kytkentä IO-korttiin.


HP:n takana on IO-kortit, joihin nauha-asema ja muut tallennuslaitteet ovat tulleet kiinni, 16-bit sisään ja toiset 16-bit ulos + parit kättelysignaalit (device command / device flag). Normaalin IO-kortin signaali on ollut CTuL (-2V...4.5V), mutta onneksi yksi "MicroBus"-kortti oli koneen mukana, jossa on TTL-tason signaali. Muuten olisi pitänyt alkaa rakentamaan signaalitason muunninta.

Koneessa ei ole mitään käyttöjärjestelmää ROM-piireillä, vaan käyttis ladataan joltain laitteelta. Vanhemmissa tietokoneissa latausohjelma (binary loader, boot loader) on pitänyt näpyttää jokaisessa käynnistyksessä paneelin kytkimistä muistiin, siis jos se ei ole säilynyt ferriittimuistissa.

HP puolestaan veivasi boot-ROMit suoraan emolle, jotta elämä olisi helpompaa. Tosin ratkaisu nykyajan mittapuun mukaan on silti vähän monimutkainen, homma kun tapahtuu seuraavasti: ensin S-rekisteriin tallennetaan yhdellä 16-bitin sanalla boot-ROMin numero, laitteen IO-osoite ja mahdolliset parametrit. Tämän jälkeen painetaan IBL-painiketta, jonka jälkeen CPU lataa mikrokoodin avustama boot loaderin todella erikoisella metodilla 4-bitin paloissa muistin ylimpään 64:ään sanaan. 

Lopuksi painetaan RUN-painiketta ja käynnistetään esimerkiksi nauha-asema ja käyttis tai haluttu ohjelma siirtyy muistiin. Loaderi ilmoitaa sitten näytön valoilla mikä meni vikaan jos meni. 


Emulaattorin rakentaminen

Emulaattorin idea on seuraava: HP:n ja PC:n väliin tuli mikrokontrolleri joka on yhdistetty HP:n IO-korttiin ja PC:n sarjaporttiin. PC lähettää terminaaliohjelmalla tiedostot binäärimuodossa ja mikrokontrolleri tuuppaa dataa 8-bittillä IO-kortista sisään renkuttaen samalla flag-bittiä, aina kun data on luettavissa.

Miljoonalaatikosta osui käteen SiliconLabsin mikrokontrollerin kehitysalusta, jossa oli riittävästi IO:ta. Paperinauha-asema ei tarvitse kuin yhteen suuntaan 8-bittiä + kättelyt, mutta kytkin kaikki karvat tulevaisuuden suunnitelmia varten. 

Nauha-aseman kytkis ja toiminnankuvaus löytyi bitsaverisista, kuten myös ROMien konekieliset listaukset, joten hommaan pääsi sisälle parissa tunnissa. Nauhaformaatin arvailu otti aikansa, se kun koostuu frameista (data pituudesta) ja checksumeista. Idea suurinpiirtein näin: ensin tulee framen pituus yhdellä tavulla (max 255 sanaa), nollatavu, absoluuttinen osoite johon frame tuupataa ja framen lopussa kaikkien datasanojen yhteenlaskuttu summa. Nauha loppuu kun 11 nollaa on tullut framen ulkopuolella.

01 - Paper tape... ei ihan ollut...


Otin laiskana ohjelmointityökaluksi MikroElektronikan Basic-kääntäjän, jolla syntyi SiLabsin ohjelma. Teoriassa kaikki piti olla kuin pitikin, mutta HP:lta tulee jokaisen latausyrityksen jälkeen virheilmoitus (siis näytön valoina), kuten "address error".

Vaihtelin vähän kaikkea ja kokeilin ylempää 8-bittiäkin random arvoilla, kunnes sain "device error" valot palamaan tauluun. Hälytyskellot alkoivat soimaan, koska kyseistä virhettä ei pitäisi tulla paperinauha-asemalla, ainakaan ROMin listauksen mukaan. Lisää pientä muistin sisällön tutkimista paneelien kytkimillä ja totesin ettei muistin sisältö vastaa HP:n huolto manuaalissa olevaa disassemblya.

Ehdin jo miettiä että tässä koneessa on jokin päivitetty ROM-versio, mutta sitten välähti, ovatko ROMit oikeilla paikoilla? 

Kone auki ja yksi muistikorteista pois, boot-ROMit näkyviin ja kas, kaksi vaihtanut paikkaansa.

00...


En tiedä onko kyseessä huolimattoman huoltomiehen virhe vai joku käytönnön pila menneiltä vuosilta, ROMit kun voi vaihtaa parissa minuutissa...

Mutta loaderin osoitetta vaihtamalla emulaattori lähti toimimaan niinkuin sen pitkin. Seuraavaksi pitää hankkia jostain TTY-kortti teletypea varten ja kokeilla HP:n OS:ää (RTE), miltä 70-luvun käyttöjärjestelmä tuntuu 2010-luvulla.

Legendaarinen Teletype ASR-33, jolla mm. Bill Gates aloitti ohjelmoinnin (siis tälläinen yhdistettynä keskustietokoneeseen). Saa HP:n kaveriksi, kunhan TTY-kortti löytyy...