MARK-I

Az 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,
Manchester University Computer


Írta: Mörk Péter 1995
 

A világ első programja

Az 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.

nooperationC252627
1 -24 to C -b
2 C to 26 -b
3 -26 to C b
4 C to 27 -bb
5 -23 to C ar(n-1)-b(n)b(n)
6 sub 27 a - b(n)
7 test
8 add 20 to cl
9 sub 26 r(n)
10 C to 25 r(n)
11 -25 to C
12 test
13 stop 00 -b(N)b(N)
14 -26 to C b(n)r(n)-b(n)b(n)
15 sub 21 b(n)-1
16 C to 27 b(n+1)b(n+1)
17 -27 to C -b(n+1)
18 C to 26 -b(n+1)
19 22 to cl r(n)-b(n+1)b(n+1)

20-3
221
224

23-a
24b

initfinal
25-r(N) (=0)
26--b(N)
27-b(N)

É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észlete

A 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