MARK-IAz angol számítástechnika akkor kapott újabb lendületet, mikor a második világháború befejeztével a német rádióadások megfejtésén dolgozó szakemberek békésebb munka után néztek. (A rejtjelek megfejtésére több gépet is készítettek a háború alatt, ezeket azonban kifejezetten kódfeltörésre tervezték. Részletes műszaki leírásuk ma is titkos, így nem lehet pontosan megmondani, mennyire illik rá ezekre a masinákra a "számítógép" név. Az azonban valószínű, hogy e kutatás kapcsán szerzett tapasztalatoknak hasznát vették az első számítógépek tervezésénél.) Két egykori "kódfeltörő", név szerint F. C. Wiliams és T. Killbrun a Manchesteri Egyetemen kaptak állást, ahol idejüket egy elektronikus számítógép összetákolásával töltötték. Valóban "tákolásról" volt szó, nem vesztegették az időt a precíz munkára, ami aztán meg is látszott a megbízhatóságon. (A gép alig pár órát működött hiba nélkül: az üzemeltetési napló szerint a folyamatos hibátlan működés rekorja kilenc óra volt.)
A gépen 1948 június 21.-én sikerrel futtatták le a világ első programját. A sikertől bátorítva a gépet továbbfejlesztették és hamarosan elkészült a nagyobb tárkapacitású, MARK I névre keresztelt számítógép. A MARK I minden lényeges alapevet és szerkezeti elemet tartalmazott, amelyek a mai számítógépek alapját képezik. A számokat binárisan ábrázolták, bár manapság szokásossal éppen ellentétes módon. (A legkisebb helyiértékű bit a bal szélső.) A teljes memóriakapacitás 256 szó, a szóhosszúság 40 bit volt. (Kivétel az akkumulátor, ami 80 bites.) A CPU teljes egészében elektroncsövekből (több mint négyezer darab triódákból és pentódákból) épült fel, 25 kW teljesítményt fogyasztva. Memóriaként un. Williams-csöveket használtak. Ez a TV képernyőjéhez hasonló foszforral bevont katódsugárcső: az elektonsugárral villamos töltést lehet létrehozni a foszforrétegben, amit ugyancsak az elektronsugár segítségével ki lehet olvasni. Bármikor bármelyik pontot olvashatjuk vagy írhatjuk, tehát a szerkezet RAM-ként használható. Mivel a töltés elszivárog, a beírt információt bizonyos időközönként frissíteni kell. A Williams csövet éppen az tette alkalmassá adattárolásra, hogy tervezőjének sikerült viszonylag egyszerű és megbízható módszert kitalálnia a frissítésre. Az adatokat tároló pontok a foszfor bevonat miatt világítottak, így szabad szemmel is le lehetett olvasni a csőbe beírt adatokat. A MARK I-ben használt Williams csövek 32 darab negyven bites szót tároltak. Ha figyelmesen szemügyre vesszük a MARK I egyik Williams csövének fényképét, akkor a 32 darab teljes hosszúságú szó mellett a képernyő tetején látunk még egy 20 bites szót is. Ez a 20 bit a világ első "page address"-e. A csövek tartalmát ugyanis el lehetett menteni egy mágnesdobos ős-winchesterre, és ez a cím mondta meg, hogy a másolat a mágnesdob melyik sávjában van. Ebből nőtt ki aztán a virtuális címzés és a "memory swapping". A géppel egy 5 bites lyukszalag olvasón, vagy a mérnöki pulton keresztül lehetett tárgyalni (ez utóbbi 20 db kapcsolóból állt, amit a gép egy utasítással le tud olvasni). Kimeneti eszközként egy szalaglyukasztó és egy nyomtató szolgált. Manchesteri látogatása során a MARK I annyira lenyűgözte a kormány egyik tudományos tanácsadóját, hogy pár nap alatt tető alá hozott egy államilag támogatott programot, amelynek keretében a Ferranti Ltd. vállalat gyártani kezdte a gépet. Ezzel a MARK I lett a világ első sorozatban gyártott, kereskedelmi forgalomba hozott elektronikus számítógépe. (Nagy üzlet nem lehetett, hat év alatt kilenc darabot adtak el belőle.) Az első Ferranti MARK I-et a Manchesteri Egyetemen helyezeték üzembe, és mivel a gép teljesítménye meghaladta az egyetem számítási igényeit, külső felhasználók számára is végeztek számításokat. Egy Dr. Glennie például az atombombák tökéletesítéséhez szükséges számításokat végzett a MARK I-en, természetesen a legnagyobb titokban. (Munka után még a nyomtató festékszalagját is el kellett égetnie.) Akkoriban még egyetlen programozási nyelv sem létezett, az assembly "fordítást" maga a programozó végezte úgy, hogy az utasítások bináris kódjainak megfelelő ASCII karaktereket begépelte egy konzolírógépen. Ezt a módszert Alan Turing vezette be, aki a háború idején végtelen órákat töltött el a rejtjelezett német rádióüzenetek öt bites kódjainak bogarászásával, így valószínűleg fel sem tűnt neki, hogy számítógépe utasításait csupa könnyen megjegyezhető néven hívják mint: T/, /N, T:, stb. A felhasználók azonban aligha lehettek ilyen bensőséges viszonban az ASCII kódtáblával, így az egyik különösen sokat számoló user (történetesen a már említett atombomba-számításokat végző Dr. Glennie) 1954-ben saját szakállára elkészítette a MARK I első assembler fordítóját. Ezt követte két évvel később R. A. Brooker "autocode" nevű nyelve, amely már minden felhasználó számára rendelkezésre állt. A MARK I gépet több ezer óra hasznos és haszontalan számítás után végül 1959-ben bontották le. (Túlságosan magas volt az egyetem villanyszámlája :-) Időközben sokkal kisebb fogyasztású, nagyobb teljesítményű és olcsóbb gépeket építettek, így a gép nyolc év alatt teljesen elavulttá vált. A MARK I-et természetesen komoly matematikai számításokra használták, de az akkor még rendkívű értékes gépidőt már akkoriban elkezdték játékprogramok fejlesztésére használni. Példaként íme itt egy angol nyevlű szerelmeslevél, amit a MARK I-en futó program "írt", a gép véletlenszám generátorának segítségével válogatva össze a kifejezéseket. (Csapnivalóan rossz szerelmeslevél író vagyok, ezért meg sem kísérlem lefordítani): Darling Sweethart, You are my avid fellow feeling. My affection curiously clings to your passionate wish. My liging yearns to your hart. You are my wistful symphaty: my tender liking. Yours beautifully, Írta: Mörk Péter 1995
A világ első programjaAz itt látható programot tartják (az eredeti kéziraton feltüntetett dátum alapján) a világ legelső elektronikus számítógépre írt programjának. A program 1948. június 21.-én produkált először használható eredményt, amihez pontosan 52 percre volt szüksége. Az algoritmus egy szám (a) legnagyobb osztóját keresi meg úgy, hogy egy megadott kezdőértéktől (b) indulva megvizsgálja, hogy a osztható-e b-vel. Ha nem, akkor b értékét eggyel csökkenti és újra próbálkozik. (Az oszthatóság vizsgálata úgy történik, hogy b értékét egy ciklusban levonjuk az a-ból és megnézzük, hogy a maradék nagyobb-e nullánál.) Az a szám a 23-as, a b kezdőérték pedig a 24-es memóriaszóbam található. A 20, 21 és 22 szavak a program konstansait tárolják. C jelenti az akkumulátort, cl pedig a programszámlálót. A test utasítás kihagyja a soron következő utasítást, ha az akkumulátor tartalma negatív.
Érdemes megfigyelni, hogy a programozónak milyen trükköket kellett bevetnie, hogy a szegényes utasításkészlettel meg tudja oldani a feladatot. A program a 13. sorban áll le, a 12. sorban lévő test utasítás miatt akkor kerül ide a vezérlés, ha az akkumulátorban nulla, vagy annál nagyobb szám van. Az algoritmusból azonban következik, hogy ezen a ponton az akkumulátor tartalma csak nulla vagy negatív szám lehet - tehát a progam csak akkor ér véget, ha az akkumulátor tartalma (vagyis az osztás maradéka) zérus. A MARK I utasításkészleteA gép utasításai 20 bitesek, ebből az első tíz bit cím, három bit a nyolc darab "B-line" (index regiszter) kiválasztására szolgál, egy bit nem használt, a maradék hat pedig az utasítás kódját adja meg. A listában használt rövidítések jelentése a következő: ACC akkumulátor (80 bites) AM az akkumulátor felső negyven bitje AL az akkumulátor alsó negyven bitje S az utasítás cím részével megcímzett memóriaszó (store line) tartalma. Az indexregiszterekre kiadott utasítások csak a 20 legkisebb helyiértékű bitet használják, a vezérlésátadó utasítások pedig csak a 10 legkisebb helyiértékű bitet. B egy B-line (indexregiszter) tartalma H a mérnöki pult 20 kapcsolóján beállított bináris szám LDA load AL (AM cleared) LDAS load AL, sign extended into AM LDN load AL negatively STA store AL STM store AM STMC store AM and clear AM SWAP interchange AM and AL STAM store AL, move AM to AL and clear AM STAC store AL and clear ACC CLR clear ACC ADD ACC := ACC + S (signed S) ADDU ACC := ACC + S (unsigned S) SUB ACC := S (signed S) ADDM AM := AM + S LDDU load D (unsigned multiplicant) LDDS load D (signed multiplicant) MADU ACC := ACC + D x S (unsigned S) MADS ACC := ACC + D x S (signed S) MSBU ACC := ACC - D x S (usigned S) MSBS ACC := ACC - D x S (signed S) AND ACC := ACC AND S (S sign extended) ORA ACC := ACC OR S (S sign extended) NEQ ACC := ACC XOR S (S sign extended) SHLS ACC := 2 x S (arithmetic shift) ORS S := AL OR S, := AL ORSC S := AL OR S, then clear ACC LDB load specified B-line STB store specfied B-line SUBB B := B - S LDBX load B-line (without modification) STBX store B-line (without modification) SBBX B := B - S (without modification) JMPA absolute indirect unconditional jump JMPR relative indirect unconditional jump JGEA if ACC positive, absolute indirect jump JGER if ACC positive, relative indirect jump JGBA if (last-named B-line positive), absolute indirect jump JGBR if (last-named B-line positive), relative indirect jump IOTH I/O transfer using H as control word IOTS I/O transfer using S as control word NORM add to AM the position of the most significant one in S SADD add to AM the number of 1st in S - population count RNDM load a random number into AL LDAD load a page address word into AL DST1 debugging stop (1) DST2 debugging stop (2) TIME S := clock HOOT pulse the console hooter STH S := console handswitches H NULL no operation Készítette: Mörk Péter 1995 |