keskiviikko 9. joulukuuta 2015

IBM 1800 - Ensimmäiset savut


Voin vihdoin ilmoittaa kaikille blogin lukijoille, että Heili on on saanut sähköä sisuksiinsa ja on melkoisen hyvissä sielun ja ruumiin voimissa, ainakin olosuhteet huomioon ottaen. Tietenkään tämä ei tapahtunut ihan päivässä, vasemmalla kädellä huitaisten tai ilman ongelmia ja armotonta skopettamista.


Alkuun virtalähteet

1800:ssa on 18 virtalähdettä, joiden kaikkien tarpeellisuus ei ole selvinnyt blogin kirjoittajallekaan. Samaa jännitettä on useampaa ja koot ovat hurjia: isoimmat 6V/18A ja massaa yli kymmenen kilon. 

Muutama virtalähde koneen takaa.

Virtalähteissä on yksi erikoinen piirre, niiden pitää ola vähintään 25% kuormalla, jotta regulointi toimii oikein. Tämä ongelma on ratkaistu koneen sisällä nipulla tehovastuksia, jotka syövät neljänneksen virtalähteiden tehosta lämmöksi, riippumatta tekeekö tietokone yhtään mitään. 

Testasin ensin jokaisen virtalähteen yksitellen pöydällä suoraan sukotulpasta, apuna skooppi ja nippu autonpolttimoita keinotekoiseksi kuormaksi. 17 virtalähdettä selviytyi hyvin testistä, vain yksi kyykkäsi kuorman alla.

Nykyään konkat eivät kestä TV:ssä edes paria vuotta, näissä näköjään kestäneet sellaisen 40 vuotta.

En alkanut enempää arvailemaan mikä siinä voisi olla vikana, koska lineaariset virtalähteet zener-vertailulla eivät ole sitä minun vahvinta alaa, joten tilasin suoraan uuden MeanWellin hakkurin tilalle. Näitä vanhoja ehtii korjailla sitten myöhemmin.


Sitten käynnistyssekvenssi

Kasaamista ei yhtään helpottanut se fakta, ettei IBM ole merkinnyt mitään voimajohdotusta millään tavalla. Eikä sekään ainakaan haastetta vähentänyt, että osa niistä surkeista johtomerkeistä joita purettessa johtoihin teipattiin, oli irronnut ja kadonnut, mahdollisesti välille Lahti-Outokumpu. Mutta luovuttaminen ei ole ollut koskaan vaihtoehto, mittasin sinnikkäästi jokaisen johdon ja päättelin melko sekaisista kuvista mikä menee minnekin. 

Heili herää kahdessa vaiheessa, ensimmäinen käynnistää logiikkapuolen virtalähteet, seuraava muistin virtalähteet. Sammuttaessa sekvenssi menee toisinpäin, ettei muisti pääse korruptoitumaan. Mikäli jokin ei mene käynnistyskytkennän älyn mukaan oikein, esim. joku jännite puuttuu, se heittää koko keksinnön sähköt alas.

Osa käynnistyssekvenssikytkentää.

Käytännössä tämä "äly", hyvin vähäinen sellainen, on rakennettu perinteiseen amerikkalaiseen tyyliin, hirveällä määrällä vastuksia, releen kelojen yli vedettyjen kondensaattoreita, tyristoreita, ties mitä...

Alkuun ruuvasin jokaisen logiikkalohkon (tai "älyoven") matajännitesyötöt puupalikkaan kiinni siihen järjestykseen missä niiden oletin kuuluvan olla. Virrat päälle, putoaa alas. Muutama arvailu, vika löytyy hätäseis-kytkimestä. Hyppyjohto yli (älä tee tätä kotona ;) ja uudelleenyritys: sama lopputulos, mutta pysyy päällä noin sekunnin pidempään. Syy löytyy yli-innokkaasta alijännitesuojasta, joka paiskaa kaiken alas, koska olettaa verkon kadonneen.

Alijännitesuojan lähtöpiuhan maahan (koska se liipaisee +3V pulssilla tyristorin, joka puolestaan aloittaa sammutussekvenssin) ja taas uudelleenyritys: sähköt pysyvät päällä ja READY-valo syttyy. Taulussa paloi valoja muutenkin kuin joulukuusessa - siis kaikki mitkä olivat ehjiä - joka johtui itse tietokoneen logiikkasähköjen puuttumisesta.

Valoja tunnelin päässä.

Mittailin sitten matalajännitteet, jotka olivat kahta johtoa lukuun ottamatta oikein arvattu. Ikävä kyllä samassa tuli huomattua yhden 3V-virtalähteen antavan melkoista rippeliä, joten sekin korvautui uudella hakkurilla.

Viimeiset piuhat kiinni...


...ja lopuksi virtanappulasta

Tämä taitaa olla niitä harvoja tietokoneita, joissa voi kokea voiman tunnetta painaessaan virtanappulaa. 40A kontaktori vetää ensimmäisen vaiheen päälle, 1.5 sekuntia perään toinen samanlainen seuraavan vaiheen. Pauke, eksoottinen (omenaisen käämin) tuoksu, flektien ja vaihtovirran humina herättää pienessä ihmisessä kunnioitusta moista sähköaivohirviötä kohtaan.

Voimapuolen kamoja.

Pienen renkuttelun jälkeen huomasin että Heilillä on ainakin jotain järkeä olevan vielä jäljellä, I-rekisteriin pystyi siirtämään vipukytkimillä lukuja. Tosin START-nappula ei tehnyt mitään kovin älykästä ja T-kello oli jumissa T7:ssä. RUN-valo syttyi, mutta T-kello ei mennyt eteenpäin, oli kone sitten Run, Single Instruction, Single Storage Cycle tai Single Step -moodissa (kyllä, tällä koneella voi mennä kellojakso kerrallaan eteenpäin!).


Tahditussignaalit oskillaattorista T-kelloon.

T-kellolla on kahdeksan askelta (tarkalleen yhdeksän, siitä alla lisää), T0...T7, jotka synkkaavat tietokoneen loogiset osat. Ilman T-kello ei ole synkkaakaan, elämää, mitään. Kyseinen kello saa voimansa A- ja B-vaiheilta, jotka puolestaan syntyvät 4MHz oskillaattorista (asiasta enemmän kiinnostuneet voivat käydä katsomassa arkkitehtuuria osan 1 ja osan 2).

Jos mennään vähän syvemmälle kellon toimintaan, kello siirtyy seuraavaan askeleeseen A-vaiheesta luodun Clock Advance -signaalin avulla. Siispä skooppi kauniiseen käteen ja katselemaan käyriä.



Hetken aikaa epäilin huonoa A- ja/tai B-vaihetta, mutta kaikki signaalit ovat tässä laitteessa ihan jotain muuta kuin 90-asteen kulmia.

Metsästin ongelman lopulta Clock Advance -signaalin juurille, jokin kolmesta signaalin ehdollistavasta lähdöstä veti sitä koko ajan maahan, joten mitään pulssia ei lähtenyt. Pään hakkaamista seinään ja lopulta keksin irroittaa kortin, jonka NOT-portin läpi tulee tuon kellonesto kahdennetulta T1:ltä. Ja katsos, sehän toimii!

Clock Advance -signaalin puuttuminen aiheuttaa T-kellon jumiutumisen.

Kahdennettu T1-kello johtuu Heilin tapauksessa laajennetusta muistista, mikä ilmeisesti tarvii enemmän aikaa, se kun sijaitsee neljän metrin päässä keskusyksiköstä. Todellisuudessa kellon askelia on siis yhdeksän ja yksi niistä ei tee mitään, ainakaan teoriassa. Eli tämä korjausmetodi ei paljon lohduttaisi, piti keksiä se alkuperäinen syy.

OR DOT tarkoittaa yhdistettyjä johtoja. Ongelman synty oli juurikin tuossa pisteessä, se pysyi maahan vedettynä ja sen veti maahan NOT-portti. Portin tulo kellui, koska kortti jolla T1 DLY  (T1 Delay -kiikku) sijaitsee, oli väärällä paikalla.

Syy löytyikin järkeilemällä. Yksi kortti jossa T1 Delay FF -kiikku sijaitsee, oli väärällä paikalla. Itse sitä en ole siirtänyt (otinkin sen monta kertaa irti ja laitoin sen aina samalle paikalle...), joten epäilykseni kymmenistä uteliasta ihmisistä, jotka ovat ronkkineet tätä vuosien varrella, pitänee varmaan paikkaansa. Pistoa ei tarvi sen sydämessään kokea, joka siirsi B-A1D2 -kortin paikkaan D3, sillä olisin minäkin tätä ronkkinut, mikäli työpaikallani olisi jotain näin hienoa ollut nurkassa pölyttymässä ;)


Eikä tässä vielä kaikki (ongelmat)

Kun T-kello toimi, sain jo muistiin tallennettua tietoa paneelin namiskojen ja nappuloiden avulla. Nyt vain tuli uusi ongelma, kone sytytteli pariteettivirhevaloa randomeista muistipaikoista. Alkuun muistijännitteiden mittailua ilman tulosta...ehti nousta pieni pelko viallisesta muistilohkosta ja diodinvaihto-/muistijännitesäätö-limbosta, mutta seurattuani hetken milloin virhevalo syttyi, tajusin että valo syttyi aina kun pariton määrä bittejä oli B-rekisterissä.

Etsi tästä sitten pinni "B-A1F2 J10"...

Skoopilla sitten mittailemaan pariteettitarkistuspiiristöä, josta löytyi ongelman juuri: B-rekisterin sisältö ei koskaan saavu piiristöön perille, joten tulos on aina "parillinen". B-rekisterin päästä bitit löytyivät ja paloihan valotkin taulussa, eli melko varma syypää löytyisi löysällä olevasta lattakaapelista. Sieltä sekin vika löytyi ja liittimen kiinni tökkäämällä pariteettivirheet katosivat.




Loppuun vielä muutama sana

Aikani loppui tältä päivältä, enkä enempää ehtinyt leikkiä koneella, vaikka kuinka olisi tehnyt mieli; välilevynpullistuma teki sen verran ison loven lompakkoon viimekuussa, ettei näille leluille jää sitäkään vähää aikaa, mikäli kinkun haluaa pöytään ennen tammikuuta.

Yksi ehdoton varuste olisi virtaprobe skooppiin, niin ei tarvisi nyppiä kortteja tai johdotuksia irti tiettyjä vikoja hakiessa, tosin hinnat lähtevät 3000 eurosta mikä on paljon rahaa... Ja vaikka rakas Owon on uskollisesti palvellut, on selvää että minun tarvitsee hankkia 4-kanavainen oskilloskooppi funktiogeneraattorilla ja logiikka-analysaattorilla. Näin monimutkaisen laitteen vianhakuun pari kanavaa ja melkoisen kökkö datanloggaus vaatii aika kestäviä hermoja. Kommenteissa saa ehdottaa merkkejä ja malleja, itselläni on pyörinyt mielessä Rigolin MSO1074Z-S. Jos sellainen jollain on, kertokoon onko hintansa väärti vempele!

Mutta ainakin nyt kone lukee käskyn muistista ja suorittaa sen, jonka voi havaita käskyn I1, I2, jne. käskysekvensseistä. Se on jo jotain koneelta, joka valmistettiin 1971, sammutettiin 1986, purettiin ja koottiin 2015. Ja vielä ihmisen toimesta, joka ei koskaan ole nähnyt moista vempainta. Joko olen helvetin onnekas idiootti tai 40 vuotta myöhässä IBM:n huoltomiehen avoimesta työpaikasta ;)


Ps. Shampanja-pulloa turha vielä korkata, tästä se entisöinti vasta alkaa. Olen 99% varma ettei kone toimi vieläkään täydellisesti (joku käsky ei toimi, keskeytykset sekoilevat, jne), mutta eipä sillä väliä. Tämän harrastuksen pointtihan on korjata näitä, eikä päästä liian helpolla!



PÄIVITYS: Vastoin kaikkia odotuksia, Heili ajaa kuin ajaakin ohjelmia! Lisää aiheesta luvassa seuraavassa postauksessa! 
Laske yksi lisää akkuun, hyppää takaisin. Karkeasti noin 200 000 käskyä sekunnissa, mikä on vuonna 1965 julkaistulle tietokoneelle kelpo saavutus.





sunnuntai 25. lokakuuta 2015

IBM 1800 - Arkkitehtuuria osa 2


Aiemmassa arkkitehtuuria käsitelleessä osassa käytiin läpi CPU:n ydintä, nyt vuorossa se muu rekvisiitta: DMA (sen aikaisin termein Cycle-Steal) sekä keskeytykset. Ja pahoitteluni blogin pitkää hiljaiseloa, töitä yrityksen parissa on ollut sen verran paljon, että harrastukset kärsivät (...pitäisi varmaan harkita oikeisiin töihin menemistä ;) ...mutta pitkän tauon jälkeen tulee sitten toistakymmentä sivua enemmän tai vähemmän täyttä asiaa. Yritän pitää tämänkin jutun selkokielisenä, jotta muutkin kuin asiaan vihkiytyneet voivat tästä saada jotain irti. Itselläni meni tovi tämän keksinnön toiminnan selvittämisessä, sillä Heilin I/O:n konsepti on melkoisen sekava kokonaisuus. Otetaan alkuun ensin I/O:n perusrakenne rautatasolla.



I/O-väylä

Edellisessa osassa sivusin lyhyesti DMA:n toimintaa, mutta mennään syvemmälle toimintaan. CPU on yhdistetty B-rekisterin (muistipuskurin) kautta "datakanavaan", joka näyttelee siis I/O-väylän (Input / Output) osaa. Tähän I/O-väylään kytketään oheislaitteet.

Kertauksen vuoksi CPU:n sisusta. I/O-väylä (kuvassa In Bus / Out Bus) ei kuitenkaan ole ihan niin yksinkertainen kuin tässä kuvassa esitetään.

Fyysinen I/O-väylä koostuu 16-bittisistä tulo- ja lähtöväylistä sekä kontrollilinjoista, jossa kulkevat johtimet niin konesynkalle, keskeytyksen kyselylle, keskeytys- ja DMA-pyynnöille.

Tässä sitten hiukan tarkempi kuva.

I/O-väylä on jaettu kolmeen osaan (käytännössä yksi ja sama väylä, kuvan I/O Channel Origin on nippu TAI-portteja) ja niihin on sitten kytketty laiteadapterit eri laitteille. Jokaiseen kolmeen väylään voidaan kytkeä 8 laiteadapteria, joilla sitten voi olla useita laitteita perässään. 1801 keskusyksikkökaapin sisältö on suurimmalta osin juurikin noita laiteadaptereita, kuten nopealle kirjoittimelle, nauha-asemalle tai plotterille. Nämähän eivät luonnollisesti riitä isoissa kokoonpanoissa, sitä varten I/O-väylää on mahdollista jatkaa keskusyksikön ulkopuolelle. Nämä adapterit ovat kylvetty esimerkiksi 1826 (Data Adapter) -kaappeihin.

Keskusyksikön sisältöä. CPU :n ydin vie vähemmän tilaa kuin DMA ja keskeytykset (Channel). Loput lohkoista ovat pelkästään I/O:n laiteadaptereita tai muistia.


Gate B:n A1- ja B1-lohkot. Näissä lohkoissa on mm. DMA:n 16 CAR-rekisteriä.

Juju näissä adaptereissa on se, että CPU voi XIO/IOCC-käskyllä käskyttää adaptereita, esimerkiksi plotteria siirtämään kynää kaakkoon ja laiteadapteri hoitaa pulssituksen plotterille. Homma toimii kanssa toisin päin, jos vaikka jonkin laiteadapteri on lukenut puskurin täyteen, tuuppaa se sen tietokoneen muistiin DMA:n avulla.
Osa adaptereista - kuten keskeytysten hallinta - on sulautettu osaksi CPU:n sisäistä kaksisuuntaista väylää (Channel Data Bus).

Muutama erikoislaiteadapteri on sulautettu osaksi CPU:n sisäistä I/O-väylää. Nämä ovat keskeytystenhallinta, sense-kytkimet/huoltotaulu ja ajastimet. Ajastimet ovat erityisen mielenkiintoiset, ohjelmoijalla on käytettävissä kolme ajastinta: A, B ja C. Nämä ajastimet voidaan ohjelmoida kutsumaan keskeytys, mutta niiden aika pitää määrittää kiinteästi johdotuksella. Ajastimet tarvittaessa myös tallentavat sen hetkisen arvonsa DMA:n avulla muistipaikkoihin 0004h, 0005h, 0006h. Käytännössä konsepti on hyvin samanlainen kuin jossain Arduinon mikrokontrollerrisa nykyään (...paitsi johtoja ei tarvitse enää vaihdella intervallien mukaan).

Kaikki laiteadapterit omaavat yksilöllisen rakenteen, mutta adapterit näkyvät CPU:lle samanlaisina; jokaisella adapterilla on tarvittaessa kyky pyytää keskeytystä tai DMA:ta ja niillä on komento- ja tilarekisterit (joihin kirjoitetaan tai luetaan XIO/IOCC-käskyllä).

I/O-väylän driverit. Looginen yksi on maahan vedettynä, siitä syystä pullup-vastukset linjojen päissä.

Pullup-vastukset ovat aina I/O-väylän viimeisessä adapterissa, tässä tapauksessa 1826 "Data Adapter" -kaapin sisällä olevassa Selector Channel:ssa (jonka tarkoitus on toimia 2840 kiintolevyohjaimen liitäntänä). Vastuskortit näkyvät IO-väylän lattakaapelien välissä.


Keskeytykset

Keskeytys on jonkin laitteen pyyntö CPU:lle lopettaa sen hetkinen ohjelmansuoritus ja keskittyä laitteen palvelemiseen. Tästä voisi antaa esimerkkinä näppäimistön, jonka nappia painetaan. CPU tällöin hyppää keskeytysvektoritaulukon kautta aliohjelmaan, joka käsittelee näppäimistön lukemisen, yleensä tallentamalla merkin (käyttöjärjestelmän) puskuriin. Ilman keskeytystä CPU joutuisi kyselemään näppäimistöltä toistuvasti "painettiinko nappia?", joka luonnollisesti tuhlaisi järjettömän kallista aikaa 60-lukulaisesta CPU:sta.

Keskeytyksiä on eri tason prioriteeteilla, ihan kuin oikeassa elämässä; puhelinmyyjän soitto ei ole yhtä tärkeä kuin juuri tuleen syttynyt savusauna. Tietokonemaailmassa puolestaan näppäimistön pyyntö ei ole ehkä se kaikken akuutein tapahtuma, huomattavasti korkeamman prioriteetin keskeytys on vaikkapa laiton käsky suoritettavassa ohjelmassa. 1800 kykenee juurikin priorisoimaan keskeytykset rauta- että softatasolla.

Taulusta löytyvät valot jokaiselle (rautatason) keskeytykselle.

Yhteensä rautatason keskeytystasoja on 27, joista 3 on varattu erikoistarkoituksiin. Loput 24 voidaan köyttää kiinni laiteadaptereihin, joilla jokaisella omat alitasot keskeytyksille: keskeytysten tilarekisteri (ILSW, Interrupt Level Status Word) sekä laitteen tilarekisteri (DSW, Device Status Word). Nämä keskeysten ja laitteen tilat luetaan softatasolla ja softa päättää mitä asialle tehdään. Käytännössä 1800:ssa voi olla satoja erilaisia ja ja eritasoisia keskeytyksiä.

Osa 1800:n laiteadapterien ILSW ja DSW. Esimerkiksi jos 1816 Printer-Keyboard pyytää keskeytyksen, ohjelma lukee ILSW:n (mustilla pallukoilla merkityt) ja tämän jälkeen tilarekisterin DSW ongelmalaadun selvittämiseksi. Kuitenkaan kaikkien laitteiden kanssa molempien rekisterien tarkastelu ei ole tarpeen, etenkään jos laiteadapterin perässä on vain yksi laite ja sillä yksi mahdollinen keskeytys.

Jos vaikka tulostin ilmoittaisi suorittaneensa hommansa loppuun ja haluaa lisää tulostettavaa, saisi CPU ensin pyynnön tulostimia ohjaavalta laiteadapterilta, tämän jälkeen CPU hyppäisi tulostimen keskeytystä hallitsevaan aliohjelmaan ja lukisi keskeytyksen tilarekisterin tulkitakseen keskeytyksen syyn. Sitten ohjelma tarkistaa jokaisen tulostimen tilarekisterin, josta selviää mikä tulostimista ilmoitti saaneensa tulostuksen valmiiksi.

Mutta entäpä jos tulostin tulee nykimään CPU:ta hihasta kesken jonkin tärkeämmän keskeytyksen palvelun? Tällöin tulostin odottaa - kuten kaikki alemman keskeytysprioriteetin omaavat laitteet - kunnes sen hetkinen korkeimman keskeytyprioriteettin aliohjelma on palveltu loppuun.

Keskeytysten prioriteetit (pienempi numero = korkeampi prioriteetti) ja hyppyosoitteet keskeytyksille.

Aliohjelmat joihin keskeytykset pakottavat CPU:n hyppäämään ovat kiinteät. Nämä ovat muistin alussa sijainneissa 00008h...00022h ja tätä taulukkoa kutsutaan keskeytysvektoritaulukoksi, kansankielellä siis nippu hyppyosoitteita. Esim. tason 9 keskeytys pakottaa CPU:n suorittamaan BSI-käskyn (Branch and Store I-Register, hyppää ja tallenna ohjelmalaskuri), joka puolestaan hakee osoitteen johon hypätään muistipaikasta 0014h. Yksi poikkeus löytyy ja se on huoltotilan (CE) keskeytys; sen hyppyosoite sijaitsee paikassa 0001h sen paluuosoite osoitteessa 000Ah. Tähän on syynä hieman erikoisempi rautatason järjestely ja kirjoitan siitä arkkitehtuurin kolmannessa osassa.

CPU osaa palata takaisin edelliseen ohjelmaan (josta se pakottiin hyppäämään) erikoisella metodilla, sillä 1800:ssa ei ole (rauta)pinoa millään asteella. Hyppy tallentaa sen hetkisen ohjelmalaskurin (siis osoitteen josta hypättiin) aliohjelman alkuun. Aliohjelma itsessään alkaa vasta seuraavasta muistipaikasta, joten paluusoite löytyy aina aliohjelman alusta. Paluu tapahtuu BSC/BOSC-käskyllä, joka nollaa myös sen hetkisen keskeytystason.

Ensimmäinen hyppy menee keskeytystason mukaan, seuraava ohjelman päättämänä (kuvassa Branch Table, keskeytysvektoritaulukon piirtäminen on unohtunut IBM:ltä).

Kuten mainittua, mitään pinoa ei ole, joten aliohjelmien pitää itse huolehtia indeksirekistereiden ja muun tilatiedon tallentamisesta, CPU ei tule sitä tekemään omatoimisesti.

Keskeytykset saa tarvittaessa päälle ja pois XIO/IOCC-käskyllä. Ainoa poikkeus on CPU:n oma sisäinen keskeytys (Memory Violation, Illegal Op Code, Parity Error, CAR Check Error), joita ei saa pois päältä. Lisäksi samaisella XIO-käskyllä voidaan ohjelmallisesti liipaista jokin keskeytyksistä aktiiviseksi.

Keskeytysten kysely.

Toisin kuin DMA-pyynnöt (jotka käsitellään alempana), keskeytykset kysellään kahdessa ryhmässä laiteadaptereilta, signaalein Poll A (0-13) ja Poll B (14-23), joista kumpikin kestää 1µs ajan. Mikäli jokin laite vastaa, molemmat A- ja B-signaalit blokataan pakotetun BSI-käskyn ajaksi, jotta pyydetyn keskeytyksen aliohjelman kutsu saadaan alkuun ja paluuosoite talteen. 


Poll A ja Poll B luodaan CPU:n T0...T3 ja T4...T7 -kellojaksoista. Tästä syntyy yksi ongelma WAIT-käskyn kanssa, käskyn idea kun on pysäyttää CPU ja odottaa (jotain) keskeytystä. Mutta CPU:n pysähtyminen tarkoittaa myös T-kellon pysäyttamistä, joten miten "pollaus" tehdään? Luovana ratkaisuna IBM on laittanut WAIT-käskyn ohittamaan T-kellon ja luomaan keskeytyskyselyn erillisellä 4µs oskillaattorilla (...eli keskeytykseen reagointi WAIT-käskyn kanssa pahimmillaan on 4 kertaa hitaampaa).


Keskeytyksistä  vastaava lohko Gate A:ssa.



XIO-käsky

Edellisestä kappaleesta jotkin voivat varmasti päätellä, etteivät asiat eivät hirveästi ole muuttuneet, mutta yksi merkittävä ero vaikkapa mikroajan tietokoneisiin on: I/O-laitteet eivät sijaitse normaalissa osoiteavaruudessa, vaan niillä on erillinen väylä ja osoiteavaruus, joten tarvitaan I/O:n käsittelyyn tarvitaan oma käsky. Sen nimi on XIO (Execute I/O).

Käskyllä itsellään ei määritetä vielä mitään, vaan käskyllä kerrotaan muistipaikka, joka sisältää sen-ihan-oikean-IO-käskyn, kahden sanan mittaisen IOCC:n (I/O Control Command).



IOCC koostuu muutamasta osasta:

Area - I/O-laitteen osoite (I/O-muistiavaruudessa).
Fun - toiminto joka suoritetaan laite adapterille
         000 CE (Customer Engineer Mode) - pudottaa laiteadapterin huoltotilaan
         001 Write - kirjoittaa laiteadapteriin sanan
         010 Read - lukee laiteadapterista sanan
         011 Sense Interrupt - lukee laiteadapterin keskeytysrekisterin
         100 Control - asettaa laiteadapterin kontrolli rekisterin
         101 Initialize Write - alustaa laiteadapterin tiedonsiirron (kirjoitus)
         110 Initialize Read - alustaa laiteadapterin tiedonsiirron (luku)
         111 Sense Device - lukee laiteadapterin tilarekisterin
Mod - laiteadapterikohtainen lisäkuvain
Address - siirrettävän tiedon rekisteri, esim. Cycle-Steal -taulukon sijainti (CPU:n muistiavaruudessa)

IOCC:llä ohjataan laiteadapterin toimintaa. IOCC:n funktio (Fun) pysyy samana laiteadapterista riippumatta, mutta lisäkuvain (Mod) vaihtelee adapterikohtaisesti, kuten myös tilarekisterin informaatio.



DMA (Cycle-Steal)

1800:ssa ei ollut maailman ensimmäistä DMA (Direct Memory Access), mutta melko tuoreesta keksinnöstä oli silti kyse reilu 40 vuotta sitten. Idea DMA:ssa on se, ettei CPU siirrä dataa ohjelmallisesti laitteesta/laitteeseen, vaan se tekee laite itse. Laite (tässä tapauksessa tarkalleen ottaen laiteadapteri) varastaa muistijaksoja CPU:lta ja siirtää dataa muistiin tai muistista pois.

On helppo ymmärtää kuinka paljon tehokkaammaksi koneen toiminta muuttuu, jos vaikka ajatellaan tulostamista. Ilman DMA:ta CPU joutuisi jokaisen merkin siirtämään yksi kerrallaan laitteeseen ja odottamaan, että tulostin saa merkin paperille ja on valmis lukemaan seuraavan merkin. Käytännössä koko CPU olisi jumissa lähes koko tulostuksen ajan, ruokkimassa pelkästään tulostinta. Vaikka tulostin käyttäisi keskeytyksiä, veisi keskeytysrutiini aikaa kohtuuttoman paljon.

Huomattavasti tehokkaampaa on kertoa tulostimelle muistialue, joka sen pitää tulostaa. Tulostin hakee sitten omaan tahtiin dataa muistista, kunnes on saanut koko alueen tulostettua ja pyytää vasta sen jälkeen keskeytyksen: "tulostus tehty, anna lisää".

1800:n tapauksessa DMA todellakin varastaa muistinkäytön kokonaan ja siitä nimikin: Cycle-Steal. CPU:n osat synkkaava sisäinen T0...T7-kello jäätyy ja DMA:n X0...X7-kello käynnistyy. Mikä on mielenkiintoista, DMA käynnistyy heti; CPU pysähtyy vaikka keskelle kertolaskua. Vasteaika pyynnöstä toteutukseen on tällä muistilaajennetulla 1800:lla 2.50µs ja saavuttaa jopa 1MB/s tiedonsiirtonopeuden.

Koska näinkin moderni laite sisältää useita muistia suoraan käyttäviä laitteita, on laiteadapterien DMA-pyynnöillä prioriteetit kuten keskeytyksillä. Esimerkiksi tulostin ei ole niin tärkeä kuin kiintolevy, jonka data on pakko lukea tietyn aikaikkunan sisällä tai se on menetetty.

Laiteadapterien keskeytys ja DMA-prioriteetteja ei voi ohjelmallisesti muuttaa, sillä ne määritetään I/O-väylän johdotuksilla.
Ylläolevan kuvan "Mixer Board (H Gate)" koneen takana.

DMA:lle on varattu osoiterekisteri CAB (Channel Address Buffer), jonka avulla DMA pystyy osoittamaan keskusmuistia. Jokaisella 16:sta DMA-pyynnön prioriteetilla on oma rekisteri CAR (Channel Address Register), johon määritetään osoite josta/johon ollaan kirjottamassa/lukemassa.
DMA:n yksinkertaistettu lohkokaavio.

CAR-rekisteriä tarvitaan useiden DMA-prioriteettien takia. Laite jolta jää tiedonsiirto kesken korkeamman DMA-prioriteetin takia, on pystyttävä jatkamaan siitä mihin se jäi.

CAB- ja CAR rekisterit sijaitsevat "keskusyksikössä", jokaisella laiteadaptereilla on puolestaan oma 16-bittinen DMA-kontrollirekisteri, joka on jaettu 2- ja 14-bitin osaan. Ensimmäinen osa on SCR (Scan Control Register) ja toinen WCR (Word Count Register). Jälkimmäisen merkitys selviää jo nimestä, se laskee kuinka monta sanaa on vielä siirrettävänä. Koska laskuri on 14-bittinen, se rajoittaa myös suurimman mahodllisen kertasiirron DMA:n avulla 16 kilosanaan (tai 32 kilotavuun). SCR:n virka on määrittää mitä tehdään, kun tiedonsiirto on loppu; ketjutetaanko tiedonsiirto ja/tai päätetäänkö se keskeytykseen (joka on luettavissa ILSW/DSW-rekistereistä).

SCR/WCR-kontrollirekisteri

DMA:n alustus tapahtuu XIO/IOCC-käskyllä ja siinä määritetyllä Initiazile Read / Initialize Write -toiminnolla, joka käynnistää tapahtumaketjun CPU:n, IO-laiteadapterin ja muistin välillä. 

DMA:n alustus.

XIO hakee IOCC:n osoitetusta muistopaikasta. IOCC määrittää laiteadapterin, sen toiminnon (Area, Fun, Modifier) sekä osoitteen, josta DMA-taulukko alkaa. Sama osoite siirretään laitetta vastaavaan CAR-rekisteriin.


DMA-taulukko(t).

DMA-taulukon ensimmäinen sana sisältää laiteadapteria varten SCR/WCR:n tiedot, mitä tehdään kun tiedonsiirto päättyy ja kuinka monta sanaa siirretään laitteen ja muistin välillä. Lisäksi jos taulukkojen ketjuttaminen on asetettu SCR:ssä, taulukon viimeinen sana sisältää osoitteen josta seuraava taulukko alkaa.
DMA:n ketjuttaminen.

CPU vertaa CAR-rekisteriä ja muistipuskuria, toisin sanoen B-rekisteriä, jossa on IOCC:n osoiteosa (...melko turha tarkistus, mutta tehtävissä "turhalla" ajalla). Tämän jälkeen itse DMA alkaa: ensin siirretään taulukon ensimmäinen sana laiteadapterin SCR/WCR:ään. CAR siirretään CAB:iin ja siihen lisätään yksi, jotta CAB osoittaa taulukon ensimmäistä siirrettävää osoitetta. 

Laiteadapteri siirtää tiedon B-rekisterin avulla ja vähentää WCR:stä yhden. Kun WCR on nollassa ( = kaikki siirretty), tapahtuu joko keskeytyspyyntö CPU:lle, seuraavaan DMA-taulukon nouto tai ei mitään, riippuen mitä ohjelmoija SCR:ään määritti. 



Vielä loppuun

Kuten voimme tästä melko kaaottisesta kuvauksesta todeta, ettei 1964 julkaistun tietokoneen vertaaminen nykyajan taskulaskimeen/rannekelloon/leivänpaahtimeen ole ihan oikeutettua. 1800:n oheislaitehallinnasta ei vieläkään ole mennyt parasta ennen -päiväys umpeen. Ensijulkaisusta kesti yli parikymmentä vuotta, ennen kuin kuolevainen pystyi ostamaan jotain yhtä pitkälle vietyä omalle pöydälleen.

Seuraavassa osassa sitten kovalevyn ja kovalevyohjaimen anatomiaa sekä joitain 60-luvun arkkitehtuurin outouksia.

Kommentit tervetulleita!


Ps. Kiitokset taas kerran Carl Claunchille vinkeistä!



Lähteitä:
Bitsavers (1800) : http://bitsavers.trailing-edge.com/pdf/ibm/1800/
ALD (kytkikset) : https://drive.google.com/open?id=0B_DR111cK6W-Yms3TURrWmkzSVk

sunnuntai 23. elokuuta 2015

1800 - Kesäkuvia

Tunnit ovat olleet tänä kesänä hiukan tiukoilla ja aikaa blogille ei ole irronnut. Mutta laitetaan nyt kaikkien iloksi pieni (...ja puolivillainen) kuvakimara 1800:n nykytilasta; koko paletti on kasassa ja pestynä. Juttua tulee ensikuussa, kunhan saan tärkeimmät työt alta pois!


























Loppuun vielä muutama julkaisematon & sekalainen prokkiskuva...